ImageVerifierCode 换一换
格式:PPT , 页数:56 ,大小:261.50KB ,
资源ID:10369521      下载积分:10 金币
快捷注册下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

开通VIP
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.zixin.com.cn/docdown/10369521.html】到电脑端继续下载(重复下载【60天内】不扣币)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

开通VIP折扣优惠下载文档

            查看会员权益                  [ 下载后找不到文档?]

填表反馈(24小时):  下载求助     关注领币    退款申请

开具发票请登录PC端进行申请

   平台协调中心        【在线客服】        免费申请共赢上传

权利声明

1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前可先查看【教您几个在下载文档中可以更好的避免被坑】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时联系平台进行协调解决,联系【微信客服】、【QQ客服】,若有其他问题请点击或扫码反馈【服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【版权申诉】”,意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:0574-28810668;投诉电话:18658249818。

注意事项

本文(Linux信号量、共享内存及消息队列.ppt)为本站上传会员【仙人****88】主动上传,咨信网仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知咨信网(发送邮件至1219186828@qq.com、拔打电话4009-655-100或【 微信客服】、【 QQ客服】),核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载【60天内】不扣币。 服务填表

Linux信号量、共享内存及消息队列.ppt

1、Click to edit Master text styles,Second level,Third level,Fourth level,Fifth level,*,Click to edit Master title style,第,8,章 信号量、共享内存和消息队列,System V IPC,3,种,IPC,机制:,信号量,(semaphore set),,用于管理对资源的访问。,消息队列,(message queue),,程序之间传递数据的一种简单方法。,共享内存,(shared memory),,用于在程序之间高效的共享数据,shell,命令,ipcs,ipcrm,访问,ipcs,

2、q,Ipcs,s,Ipcs,-m,Ipcrm,#,ipcs,-mIPC status from as of 2007,年,04,月,10,日 星期二,18,时,32,分,18,秒,CSTT ID KEY MODE OWNER GROUPShared Memory:m 0 0 x50000d43-,rw-r-r,-root,root,m 501 0 x1e90c97c-,rw-r,-oracle,dba,2,System V IPC,的共同特征,标识符与关键字,引用,IPC,对象:标识符,创建,IPC,对象时指定关键字,(,key_t,key;),key,的选择,:,预定义常数,IPC_PRIV

3、ATE,;,ftok,函数,内核将关键字转换成标识符,许可权结构,和文件类比,struct,ipc_perm,3,struct,ipc_perm,struct,ipc_perm,u i d _ t u i d;/*owners effective user id*/,g i d _ t g i d;/*owners effective group id*/,u i d _ t,cuid,;/*creators effective user id*/,g i d _ t c g i d;/*creators effective group id*/,m o d e _ t mode;/*acce

4、ss modes*/,u l o n g s e q;/*slot usage sequence number*/,k e y _ t key;/*key*/,4,SV IPC,系统调用,功能,消息队列,信号量,共享内存,分配一个,IPC,对象,获得对,IPC,的访问,msgget,semget,shmget,IPC,操作,:,发送,/,接收消息,信号量操作,连接,/,释放共享内存,msgsnd,/,msgrcv,semop,shmat,/,shmdt,IPC,控制:获得,/,修改状态信息,取消,IPC,msgctl,semctl,shmctl,5,信号量,并发程序设计,互斥和同步,PV,操作

5、原语,),P,操作:用于等待,V,操作:用于信号,6,PV,操作和信号量,procedure,p(var,s:samephore,),s.value,=s.value-1;,if(,s.value,0),sleep(s.queue,);,procedure,v(var,s:samephore,),s.value,=s.value+1;,if(,s.value,=0),wakeup(s.queue,);,7,一个理论性的例子,s,emaphore,sv,=1;,l,oop forever,P(sv,);,critical code section;,V(sv,);,noncritical

6、code section;,8,内核中与信号量有关的数据结构,semaphore set,struct,semid_ds,struct,ipc_perm,sem_perm,;,struct,sem,*,sem_base,;,/*,指向信号量集合的指针*,/,time_t,sem_otime,;/*,最后一次操作的时间*,/,time_t,sem_ctime,;/*,最后一次改变此结构的时间*,/,unsigned short,sem_nsems,;,/*,集合中信号量个数*,/,9,Linux/UNIX,的信号量机制,struct,sem,pid_t,sempid,;,/*,最后操作该信号量的

7、进程,ID*/,unsigned short,semncnt,;/*,等待对该信号量执行,P,操作的进程数*,/,unsigned short,semzcnt,;/*,等待,semval,为,0,的进程数*,/,unsigned short,semval,;,/*,信号量当前值*,/,10,信号量系统调用,#include,#include,#include,int,semget,(key_t,key,int,nsems,int,semflg,);,int,semop,(int,semid,struct,sembuf,*sops,unsigned,nsops,);,int,semctl,(in

8、t,semid,int,semnum,int,cmd,.);,11,semget,函数,功能:创建一个新信号量或取得一个已有信号量的,标志符。,函数原型为,int,semget,(key_t,key,int,nsems,int,semflg,);,“key”,参数,预定义常数,IPC_PRIVATE,;,约定的关键字,ftok,函数,“,semflg,”,参数,设置访问权限,(,低,9,位,),IPC_CREAT,IPC_EXCL,按位或,“,nsems,”,指定需要的信号量数目,几乎总是取值为,1,。,#include,key_t,ftok,(const,char*,path,int,id)

9、12,semget,函数(续),sem_id,=,semget,(key_t)1234,1,0666|IPC_CREAT);,13,semop,函数,功能:改变信号量的值,函数原型为,int,semop,(int,semid,struct,sembuf,*sops,size_t,nsops,);,“sops”,参数,struct,sembuf,unsigned short,sem_num,;/*,信号量编号*,/,short,sem_op,;/*,信号量操作*,/,short,sem_flg,;/*,操作标志*,/,nsops,参数,结构数组的元素个数,14,semop,函数(续),sem

10、flg,用于对操作进行适当的控制,主要,有,2,个控制标志。,IPC_NOWAIT,当指定的操作不能完成时,进程不等待立即返回,返回值为,-1,,,errno,置为,EAGAIN,。,SEM_UNDO,(建议),进程退出时,执行信号量解除(,undo,)操作。,15,semop,函数(续),int,semaphore_p(void,),struct,sembuf,sem_b,;,sem_b.sem_num,=0;,sem_b.sem_op,=-1;/*P()*/,sem_b.sem_flg,=SEM_UNDO;,if(,semop(sem_id,&,sem_b,1)=-1),fprintf(

11、stderr,semaphore_p,failedn);,return(0);,return(1);,16,semop,函数(续),static,int,semaphore_v(void,),struct,sembuf,sem_b,;,sem_b.sem_num,=0;,sem_b.sem_op,=1;/*V()*/,sem_b.sem_flg,=SEM_UNDO;,if(,semop(sem_id,&,sem_b,1)=-1),fprintf(stderr,semaphore_v,failedn);,return(0);,return(1);,17,semctl,函数,功能:直接控制信号量信

12、息,函数原型为:,int,semctl,(int,semid,int,semnum,int,cmd,.);,第,4,个参数(可选),union,semun,int,val,;,/*,用于,SETVAL,命令,指明要设置的值*,/,struct,semid_ds,*,buf,;,/*,用于,IPC_STAT/IPC_IPC_SET,命令,用来存放信号量集合数据结构,*,/,unsigned short*array;,/*,用于,GETALL/SETALL,命令,用来存放所获得的或是要设置信号量集合中所有信号量的值,*,/,arg,;,“,cmd,”,参数,18,semctl,函数(续),“,cm

13、d,”parameter,IPC_STAT:,对指定的信号量标识返回,arg.semid_ds,结构中的当前值,IPC_SET:,在进程有足够权限的前提下,把信号量集合的当前关联值置为,arg.semid_ds,结构给出的值,IPC_RMID:,删除信号量集合,SETVAL:,设置信号量集合中由,semnum,指定的单个信号量的值,(,设为,arg.val,),19,semctl,函数(续),int,set_semvalue(void,),union,semun,sem_union,;,sem_union.val,=1;,if(,semctl,(sem_id,0,SETVAL,sem_unio

14、n,)=-1),return(0);,return(1);,void,del_semvalue(void,),union,semun,sem_union,;,if(,semctl,(sem_id,0,IPC_RMID,sem_union,)=-1),fprintf(stderr,Failed to delete semaphoren);,20,Examples,一个完整的实例,sem1.c(,进程互斥,),21,semun.h,#if,defined(_GNU_LIBRARY,_)&!,defined(_SEM_SEMUN_UNDEFINED,),/*union,semun,is define

15、d by including */,#else,/*according to X/OPEN we have to define it ourselves*/,union,semun,int,val,;,struct,semid_ds,*,buf,;,unsigned short,int,*array;,#,endif,22,int,main(int,argc,char*,argv,),int,i;,int,pause_time,;,char,op_char,=O;,srand(unsigned,int)getpid,();,sem_id,=semget(key_t)1234,1,0666|IP

16、C_CREAT);,if(,argc,1),if(!,set_semvalue,(),fprintf(stderr,Failed to initialize semaphoren);,exit(EXIT_FAILURE,);,op_char,=X;,sleep(2);,23,for(i,=0;i 1),sleep(10);,del_semvalue,();,exit(EXIT_SUCCESS,);,24,static,int,set_semvalue,(void,),union,semun,sem_union,;,sem_union.val,=1;,if(,semctl,(sem_id,0,S

17、ETVAL,sem_union,)=-1)return(0);,return(1);,static void,del_semvalue,(void,),union,semun,sem_union,;,if(,semctl,(sem_id,0,IPC_RMID,sem_union,)=-1),fprintf(stderr,Failed to delete semaphoren);,25,static,int,semaphore_p,(void,),struct,sembuf,sem_b,;,sem_b.sem_num,=0;,sem_b.sem_op,=-1;/*P()*/,sem_b.sem_

18、flg,=SEM_UNDO;,if(,semop,(sem_id,&,sem_b,1)=-1),fprintf(stderr,semaphore_p,failedn);,return(0);,return(1);,static,int,semaphore_v,(void,),struct,sembuf,sem_b,;,sem_b.sem_num,=0;,sem_b.sem_op,=1;/*V()*/,sem_b.sem_flg,=SEM_UNDO;,if(,semop,(sem_id,&,sem_b,1)=-1),fprintf(stderr,semaphore_v,failedn);,ret

19、urn(0);,return(1);,26,共享内存,共享内存,共享内存是内核为进程创建的一个特殊内存段,它将出现在自己的地址空间中,其它进程可以将同一段共享内存连接,(attach),到自己的地址空间,最快的进程间通信方式,不提供任何同步功能,27,共享内存示意图,进程,A,的,逻辑地址空间,进程,B,的,逻辑地址空间,物理内存,共享存储,28,shmid_ds,结构,struct,shmid_ds,struct,ipc_perm,shm_perm,;/see XSI IPC,size_t,shm_segsz,;/size of segment in bytes,pid_t,shm_lpid

20、/,pid,of last,shmop,pid_t,shm_cpid,;/,pid,of creator,shmatt_t,shm_nattch,/number of current attaches,time_t,shm_atime,;/last-attach time,time_t,shm_dtime,;/last-detach time,time_t,shm_ctime,;/last-change time,;,29,共享内存系统调用,#include,#include,#include,int,semget,(key_t,key,int,size,int,flag);,void*,

21、shmat,(int,shmid,void*,addr,int,flag);,int,shmdt,(void,*,addr,);,int,shmctl(int,shmid,int,cmd,struct,shmid_ds,*,buf,);,30,shmget,函数,#include,#include,#include,int,semget,(key_t,key,size_t,size,int,shmflag,);,成功返回一个共享内存标识符,失败返回,1,第一个参数,key,为共享内存段命名。,第二个参数,size,为需要共享的内存容量。(如果,key,已存在时,必须不大于该共享内存段的大小),

22、第三个参数设置访问权限,(,低,9,位)和,IPC_CREAT,IPC_EXCL,按位或。,功能:获得或创建一个共享内存标识符。,31,shmget,函数(续),shmid,=,shmget,(key_t)1234,sizeof(struct,shared_use_st),0666|IPC_CREAT);,32,shmat,函数,#include,#include,#include,void*,shmat,(int,shm_id,const void*,addr,int,shmflg,);,成功返回共享存储段连接的实际地址,失败返回,-1,第一个参数,shm_id,为,shmget,返回的共享

23、内存标识符。,第二个参数,shm_addr,指明共享内存段要连接到的地址,通常是,一个空指针,表示让系统来选择共享内存出现的地址。,第三个参数,shmflg,可以设置两个标志位,SHM_RND,(与,shm_addr,联合使用,控制内存连接的地址),SHM_RDONLY,要连接的共享内存段是只读的。,功能:将共享内存段连接到一个进程的地址空间中。,33,shmdt,函数,#include,#include,#include,int,shmdt,(const,void*,shmaddr,);,其中,shmaddr,为,shmat,返回的地址。,功能:将共享内存从当前进程中分离。,34,shmct

24、l,函数,int,shmctl,(int,shm_id,int,command,struct,shmid_ds,*,buf,);,成功返回,0,,失败返回,-1,功能:查看及修改共享内存段的,shmid_ds,结构,删除该结构以及相连的共享存储段标识。,第二个参数,commad,取值:,IPC_STAT,buf,指向当前共享内存段的,shmid_ds,结构,IPC_SET,把共享内存段的当前关联值设置为,shmid_ds,结构给出的值,IPC_RMID,从系统中删除该共享存储段。,35,例,1,:生产者程序,int,main(void,),key=5678;,if(shmid,=,shmget

25、ke,y,SHMSZ,,,IPC_CREAT|0666,)0),exit(EXIT_FAILURE,);,if(shm,=shmat(shmid,NULL,0)=(char*)-1),exit(EXIT_FAILURE,);,s=,shm,;,for(c,=,a;c,=,z;c,+),*s+=c;,*s=NULL;,while(*,shm,!=*)sleep(1);,exit(EXIT_SUCCESS,);,36,int,main(void,),if(,shmid,=,shmget(key,SHMSZ,,,0666),written_by_you,=0;,39,while(running),

26、while(shared_stuff-written_by_you=1),sleep(1);,printf(waiting for client.n);,printf(Enter some text:);,fgets(buffer,BUFSIZ,stdin);,strncpy(shared_stuff-some_text,buffer,TEXT_SZ);,shared_stuff-written_by_you=1;,if(strncmp(buffer,end,3)=0),running=0;,40,例,2,:消费者程序,int main(),shmid=shmget(key_t)1234,si

27、zeof(struct shared_use_st),0666|IPC_CREAT);,shared_memory=shmat(shmid,(void*)0,0);,if(shared_memory=(void*)-1),fprintf(stderr,shmat failedn);,exit(EXIT_FAILURE);,printf(Memory attached at%Xn,(int)shared_memory);,41,shared_stuff=(struct shared_use_st*)shared_memory;,shared_stuff-written_by_you=0;,whi

28、le(running),if(shared_stuff-written_by_you),printf(You wrote:%s,shared_stuff-some_text);,sleep(rand()%4);,shared_stuff-written_by_you=0;,if(strncmp(shared_stuff-some_text,“end”,3)=0),running=0;,42,消息队列,消息队列,消息队列是消息的链表,存放在内核中并由消息队列标识符标识。,First in,first out,消息独立于发送和接收进程而存在,块数据,每个数据块都含有一个类型,struct,msqi

29、d_ds,43,struct,msqid_ds,struct,msqid_ds,struct,ipc_perm,msg_perm,;,msgqnum_t,msg_qnum,;,/,消息的数量,msglen_t,msg_qbytes,;,/,最大消息的长度,pid_t,msg_lspid,;,/,最后一个发送到消息队列的进程,ID,pid_t,msg_lrpid,;,/,最后一个读取消息的进程,ID,time_t,msg_stime,;,/,最后一次发送到消息队列的时间,time_t,msg_rtime,;,/,最后一次读取消息的时间,time_t,msg_ctime,;,/,最后一次改变的时间

30、44,消息队列系统调用,#include,#include,#include,int,msgget,(key_t,key,int,flag);,int,msgsnd,(int,msqid,const void*,ptr,size_t,nbytes,int,flag);,int,msgrcv,(int,msqid,void*,ptr,size_t,nbytes,long,msgtype,int,flag);,int,msgctl,(int,msqid,int,cmd,struct,shmid_ds,*,buf,);,45,消息的结构,消息结构约束,必须小于系统规定的上限(,MSGMAX,)

31、必须以长整型成员变量开始,表示消息的类型。,例:,struct,my_message,long,int,message_type,;,char qtext10;,46,msgsnd,和,msgrcv,int,msgsnd,(int,msqid,const void*,ptr,size_t,nbytes,int,msgflag);,int,msgrcv,(int,msqid,void*,ptr,size_t,nbytes,long,int,msgtype,int,msgflag);,其中:,nbytes,不包括长整型消息类型成员变量的长度。,msgrcv,的第四个参数,type,指明要接收的消

32、息类型:,msgtype,=0,接收第一条消息,msgtype,0,接收其类型等于,msgtype,的第一个消息,msgtype,0,接收其类型小于或等于,msgtype,绝对值 的第一个消息,msgflag,可设置,IPC_NOWAIT,,一般为,0,47,#include,#include,#include,#include,#include,#define QKEY (key_t)0105,#define QPERM 0660,#define MAXOBN 50,#define MAXPRIOR 10,struct,q_entry,long,mtype,;,char mtextMAXOB

33、N+1;,48,int,init_queue(void,),int,queue_id,;,if(queue_id,=,msgget,(QKEY,IPC_CREAT|QPERM,)=-1),perror(“msgget,failed”);,return(,queue_id,);,49,int,send(char,*,objname,int,priority),int,len,s_qid,;,struct,q_entry,s_entry,;,if(s_qid,=,init_queue,()=-1),return(-1);,s_entry.mtype,=(,long)priority,;,strnc

34、py(s_entry.mtext,objname,MAXOBN,);,if(,msgsnd,(s_qid,&s_entry,len,0)=-1),perror(“msgsnd,failed”);,return(-1);,else,return 0;,50,int,receive(void,),if(r_qid,=,init_queue,()=-1),return(-1);,for(;),if(mlen,=,msgrcv,(r_qid,&r_entry,MAXOBN,(-,1*MAXPRIOR),0)=-1),perror(“msgrcv,failed”);,return(-1);,else,r

35、entry.mtextmlen,=0;,printf(“npriority:%ld,name:%sn”,msg,-,mtype,msg,-,mtext,);,51,msgctl,函数,函数原型,int,msgctl,(int,msqid,int,cmd,struct,msqid_ds,*,buf,);,“,cmd,”parameter,IPC_STAT:,把,msqid_ds,结构中的数据置为消息队列的当前关联值,IPC_SET:,在进程有足够权限的前提下,把消息队列的当前关联值置为,msqid_ds,结构给出的值,IPC_RMID:,删除消息队列,52,#define MAX_TEXT 5

36、12,struct,my_msg_st,long,int,my_msg_type,;,char,some_textMAX_TEXT,;,;,int,main(),int,running=1;,struct,my_msg_st,some_data,;,int,msgid,;,char,bufferBUFSIZ,;,msgid,=msgget(key_t)1234,0666|IPC_CREAT);,while(running,),printf(Enter,some text:);,fgets(buffer,BUFSIZ,stdin,);,some_data.my_msg_type,=1;,strc

37、py(some_data.some_text,buffer);,发送者程序,53,if(,msgsnd(msgid,(void*)&,some_data,MAX_TEXT,0)=-1),fprintf(stderr,msgsnd,failedn);,exit(EXIT_FAILURE,);,if(,strncmp(buffer,end,3)=0),running=0;,exit(EXIT_SUCCESS,);,54,int,main(),int,running=1;,int,msgid,;,struct,my_msg_st,some_data,;,long,int,msg_to_receive,=0;,msgid,=msgget(key_t)1234,0666|IPC_CREAT);,while(running,),if(,msgrcv(msgid,(void*)&,some_data,BUFSIZ,msg_to_receive,0)=-1),接收者程序,55,printf(You,wrote:%s,some_data.some_text,),if(,strncmp(some_data.some_text,end,3)=0),running=0;,if(,msgctl(msgid,IPC_RMID,0)=-1),56,

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服