106 SYSV进程间通信.ppt
《106 SYSV进程间通信.ppt》由会员分享,可在线阅读,更多相关《106 SYSV进程间通信.ppt(26页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、10.610.6SYS V SYS V 进程间通信进程间通信内容内容:信号量信号量;消息队列消息队列;共享内存。共享内存。10.6.1 10.6.1 三者三者共有的特性共有的特性IPCIPC资资源源:表表示示单单独独的的消消息息队队列列、共共享享内内存存或是信号量集合。或是信号量集合。三三者者均均有有XXXgetXXXget()及及XXXctlXXXctl()函函数数(XXXXXX代表代表msgmsg,semsem,shmshm三者之一)。三者之一)。1)1)XXXgetXXXget()()函数函数 两个共同参数:两个共同参数:keykey和和oflagoflag。keykey既既可可由由ft
2、okftok()函函数数产产生生,也也可可以以是是IPC_PRIVATEIPC_PRIVATE常常量量,keykey值值是是IPCIPC资资源源的的外外部部表示表示。oflagoflag包括读写权限,还可以包含包括读写权限,还可以包含IPC_IPC_CREATECREATE和和IPC_EXCLIPC_EXCL标标志志位位。它它们们组组合合的的效效果果如下:如下:(1)(1)指指定定keykey为为IPC_PRIVATE,IPC_PRIVATE,保保证证创创建建一一个惟一的个惟一的IPCIPC资源。资源。(2)(2)设设置置oflagoflag参参数数的的IPC_CREATEIPC_CREATE
3、标标志志位位,但但不不设设置置IPC_EXCLIPC_EXCL。如如果果相相应应keykey的的IPCIPC资资源源不不存存在在,则则创创建建一一个个IPCIPC资资源源,否否则则返返回回已已存在的存在的IPCIPC资源。资源。(3)oflag(3)oflag参参数数的的IPC_CREATEIPC_CREATE和和IPC_EXCLIPC_EXCL同同时时设设置置。如如果果相相应应keykey的的IPCIPC资资源源不不存存在在,则则创创建建一一个个IPCIPC资资源源。否否则则返返回回一一个个错错误误信信息。息。2)XXXctl2)XXXctl()()均均提提供供IPC_SETIPC_SET,
4、IPC_STATIPC_STAT和和IPC_RMIDIPC_RMID命命令令。前前两两者者用用来来设设置置或或得得到到IPCIPC资资源源的的状状态态信息,信息,IPC_RMIDIPC_RMID用来释放用来释放IPCIPC资源。资源。共同的操作模式共同的操作模式:都都是是先先通通过过XXXgetXXXget()创创建建一一个个IPCIPC资资源源,返返回回值值是是该该IPCIPC资资源源IDID。在在以以后后的的操操作作中中,均均以以IPCIPC资资源源IDID为为参参数数,以以对对相相应应的的IPCIPC资资源源进行操作。进行操作。别别的的进进程程可可以以通通过过XXXgetXXXget()
5、取取得得已已有有的的IPCIPC资资源源IDID(权权限限允允许许的的话话)并并对对其其操操作作,从而使进程间通信成为可能。从而使进程间通信成为可能。共同的数据结构:每每一一类类IPCIPC资资源源都都有有一一个个ipc_idsipc_ids结结构构的的全全局局变变量量用用来来描描述述同同一一类类资资源源的的公公有有数数据据,三三个个全全局局变变量量分别是分别是semid_dssemid_ds,msgid_dsmsgid_ds和和shmid_dsshmid_ds。structstruct ipc_idsipc_ids intint size;/*entries size;/*entries数组
6、的大小数组的大小*/intint in_use;/*entries in_use;/*entries数组已使用的元素个数数组已使用的元素个数*/intint max_id;max_id;unsigned short unsigned short seqseq;unsigned short unsigned short seq_maxseq_max;tructtruct semaphore semaphore semsem;/*;/*控制对控制对ipc_idsipc_ids结构的访问结构的访问*/spinlock_tspinlock_t aryary;/*;/*自旋锁控制对数组自旋锁控制对数组e
7、ntriesentries的访问的访问*/structstruct ipc_idipc_id*entries;*entries;structstruct ipc_idipc_id structstruct kern_ipc_permkern_ipc_perm*p;*p;数组数组entriesentries的每一项指向一个的每一项指向一个kern_ipc_permkern_ipc_perm结结构构,kern_ipc_permkern_ipc_perm结结构构表表示示每每一一个个IPCIPC资资源源的的属性,用来控制操作权限属性,用来控制操作权限。structstruct kern_ipc_per
8、mkern_ipc_perm key_t key;/*key_t key;/*用户提供的键值用户提供的键值,为为XXXgetXXXget()()所用所用*/uid_tuid_t uiduid;/*;/*创建者用户创建者用户ID*/ID*/gid_tgid_t gidgid;/*;/*创建者组创建者组ID*/ID*/uid_tuid_t cuidcuid;/*;/*所有者用户所有者用户ID*/ID*/gid_tgid_t cgidcgid;/*;/*所有者组所有者组ID*/ID*/mode_t mode;/*mode_t mode;/*操作权限,包括读、写等操作权限,包括读、写等*/unsign
9、ed long unsigned long seqseq;因因为为每每个个IPCIPC资资源源描描述述符符的的第第一一个个成成员员就就是是kern_ipc_permkern_ipc_perm结结构构。因因此此,我我们们可可以以认认为为数数组组entries entries 的每一非空项均指向一个的每一非空项均指向一个IPCIPC资源。资源。IPCIPC资源资源IDID与与entriesentries数组下标的联系:数组下标的联系:1)1)当创建一个当创建一个IPCIPC资源时资源时 2)2)当当知知道道IPCIPC资资源源IDID时时,可可通通过过IPCIPC资资源源ID ID SEQ_MUL
10、TIPLIERSEQ_MULTIPLIER得得到到其其在在entriesentries数数组中的组中的indexindex,从而找到相应的从而找到相应的IPCIPC资源。资源。3)why3)why保保证证在在一一段段时时期期内内IPCIPC资资源源IDID的的惟惟一性。一性。调调用用函函数数ipc_addidipc_addid()从从相相应应ipc_idsipc_ids结结构构的的entriesentries数数组组中中找找出出第第一一个个未未使使用用的的项项,然然后后返返回回其其下标下标indexindex。返回返回IPCIPC资源资源IDIDIPCIPC资源资源ID=ID=SEQ_MULT
11、IPLIERseqSEQ_MULTIPLIERseqindexindexSEQ_ SEQ_ MULTIPLIERMULTIPLIER是是可可用用资资源源的的最最大大数数目目,seqseq是是ipc_idsipc_ids结结构构中中的的seqseq。每每当当分分配配一一个个IPCIPC资资源源时时,ipc_idsipc_ids结构中的结构中的seqseq就增就增1 1。10.6.210.6.2 信号量信号量 信信号号量量是是具具有有整整数数值值的的对对象象,它它支支持持P P,V V原原语语。进进程程可可以以利利用用信信号号量量实实现现同同步步和互斥。和互斥。SYSVSYSV支支持持的的信信号号
12、量量实实质质上上是是一一个个信信号号量量集集合合,由由多多个个单单独独的的信信号号量量组组成成。我我们们称称SYSVSYSV信信号号量量为为信信号号量量集集合合,而而单单个个的的信号量直接称为信号量。信号量直接称为信号量。信号量集合在内核中用结构信号量集合在内核中用结构sem_arraysem_array表示。表示。structstruct sem_arraysem_array structstruct kern_ipc_permkern_ipc_permsem_permsem_perm;time_t time_t sem_otimesem_otime;/*/*最近一次操作时间最近一次操作时间
13、*/time_t time_t sem_ctimesem_ctime;/*/*最近一次的改变时间最近一次的改变时间*/structstruct semsem*sem_basesem_base;/*;/*指向第一个信号量指向第一个信号量*/structstruct sem_queuesem_queue*sem_pendingsem_pending;/*;/*挂起操作队列挂起操作队列*/structstruct sem_queuesem_queue *sem_pending_lastsem_pending_last;structstruct sem_undosem_undo *undo;*undo
14、;unsigned long unsigned long sem_nsemssem_nsems;/*;/*信号量的个数信号量的个数*/;信信号号量量集集合合中中的的每每一一个个信信号号用用结结构构semsem表表示示:structstruct semsem intintsemvalsemval;/*;/*信号量的当前值信号量的当前值*/intintsempidsempid;/*;/*最近对信号量操作进程的最近对信号量操作进程的pidpid*/*/;信信号号量量的的初初始始值值可可以以调调用用函函数数semctlsemctl()进进行行设置。设置。用用户户可可以以调调用用函函数数semopsem
15、op()对对信信号号量量集集合合中中的的一个或多个信号量进行操作。一个或多个信号量进行操作。每一个操作都是每一个操作都是sembufsembuf结构变量:结构变量:structstruct sembufsembuf unsigned short unsigned short sem_numsem_num;/*;/*在在sem_basesem_base 数组中的下标数组中的下标*/short short sem_opsem_op;short short sem_flgsem_flg;intint semop(intsemop(int semidsemid,structstruct sembufs
16、embuf*opsptropsptr,size_t size_t nopsnops););semidsemid:IPC:IPC资源资源IDID opsptropsptr:操作的集合操作的集合 nopsnops:数组数组opsptropsptr的大小的大小 内核必须保证操作数组内核必须保证操作数组opsptropsptr原子的执行原子的执行。sem_numbersem_number指明是对哪一个信号操作。指明是对哪一个信号操作。sem_flagsem_flag指明一些操作标志位,可以有如下值:指明一些操作标志位,可以有如下值:(1)SEM_UNDO(1)SEM_UNDO。当当进进程程结结束束但但
17、还还拥拥有有信信号号量量资资源源时时,应应将将信信号号量量资资源源返返还还给给相相应应的的信信号号量量集集合合。内内核核有有一一个个sem_undosem_undo结结构构用用于于跟跟踪踪这这方方面面的的情情况况,进进程程描描述述符符有有个个semundosemundo成成员员记记录录进进程程这这方方面面的的信息。信息。(2)(2)IPC_NOWAITIPC_NOWAIT。当当操操作作不不能能立立即即完完成成时时,若若IPC_NOWAITIPC_NOWAIT被设置的话,进程立即返回。被设置的话,进程立即返回。否否则则进进程程进进入入睡睡眠眠状状态态,等等待待时时机机成成熟熟时时被被唤醒完成该操
18、作。唤醒完成该操作。sem_opsem_op指指定定具具体体的的操操作作,它它的的值值有有如如下下含义:含义:(1)(1)大大于于0 0,则则将将该该值值加加到到信信号号量量的的当当前前值上。值上。(2)(2)等等于于0 0,那那么么用用户户希希望望信信号号量量的的当当前前值值变变为为0 0。如如果果值值已已经经是是0 0,则则立立即即返返回回。如如果不是果不是0 0,则取决于,则取决于IPC_NOWAITIPC_NOWAIT是否被设置。是否被设置。(3)(3)小小于于0 0,则则要要看看信信号号量量的的当当前前值值是是否否大大于于等等于于sem_opsem_op的的绝绝对对值值。如如果果大大
19、于于等等于于它它的的绝绝对对值值,就就从从信信号号量量的的当当前前值值中中减减去去sem_opsem_op的的绝绝对对值值。如如果果小小于于它它的的绝绝对对值值,则则取决于取决于IPC_NOWAITIPC_NOWAIT是否被设置是否被设置。当当进进程程的的信信号号量量操操作作不不能能完完成成睡睡眠眠时时,需需要要将将一一个个代代表表着着当当前前进进程程的的sem_queuesem_queue结结构构链链入入相相应应的的信信号号 量量 集集 合合 的的 等等 待待 队队 列列,即即 sem_arraysem_array结结 构构 的的sem_pendingsem_pending队列。队列。str
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 106 SYSV进程间通信 SYSV 进程 通信
限制150内