预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共27页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

10.6SYSV进程间通信10.6.1三者共有的特性IPC资源表示单独的消息队列、共享内存或是信号量集合oflag包括读写权限还可以包含IPC_CREATE和IPC_EXCL标志位。它们组合的效果如下:(1)指定key为IPC_PRIVATE保证创建一个唯一的IPC资源。(2)设置oflag参数的IPC_CREATE标志位但不设置IPC_EXCL。如果相应key的IPC资源不存在则创建一个IPC资源否则返回已存在的IPC资源。(3)oflag参数的IPC_CREATE和IPC_EXCL同时设置。如果相应key的IPC资源不存在则创建一个IPC资源。否则返回一个错误信息。(b)XXXctl()均提供IPC_SET、IPC_STAT和IPC_RMID命令。前两者用来设置或得到IPC资源的状态信息IPC_RMID用来释放IPC资源。共同的数据结构每一类IPC资源都有一个ipc_ids结构的全局变量用来描述同一类资源的公有数据三个全局变量分别是semid_dsmsgid_ds和shmid_ds。structipc_ids{intsize;/*entries数组的大小*/intin_use;/*entries数组已使用的元素个数*/intmax_id;unsignedshortseq;unsignedshortseq_max;tructsemaphoresem;/*控制对ipc_ids结构的访问*/spinlock_tary;/*自旋锁控制对数组entries的访问*/structipc_id*entries;};structipc_id{structkern_ipc_perm*p;};数组entries的每一项指向一个kern_ipc_perm结构kern_ipc_perm结构表示每一个IPC资源的属性用来控制操作权限。structkern_ipc_perm{key_tkey;/*用户提供的键值为XXXget()所用*/uid_tuid;/*创建者用户ID*/gid_tgid;/*创建者组ID*/uid_tcuid;/*所有者用户ID*/gid_tcgid;/*所有者组ID*/mode_tmode;/*操作权限包括读、写等*/unsignedlongseq;};因为每个IPC资源描述符的第一个成员就是kern_ipc_perm结构。因此我们可以认为数组entries的每一非空项均指向一个IPC资源。IPC资源ID与entries数组下标的联系(1)当创建一个IPC资源时调用函数ipc_addid()从相应ipc_ids结构的entries数组中找出第一个未使用的项然后返回其下标index。返回IPC资源IDIPC资源ID=SEQ_MULTIPLIER*seq+indexSEQ_MULTIPLIER是可用资源的最大数目seq是ipc_ids结构中的seq。每当分配一个IPC资源时ipc_ids结构中的seq就增一。(2)当知道IPC资源ID时可通过IPC资源ID%SEQ_MULTIPLIER得到其在entries数组中的index从而找到相应的IPC资源。(3)why保证在一段时期内IPC资源ID的唯一性10.6.2信号量信号量是具有整数值的对象它支持P、V原语。进程可以利用信号量实现同步和互斥SYSV支持的信号量实质上是一个信号量集合由多个单独的信号量组成。我们称SYSV信号量为信号量集合而单个的信号量直接称为信号量。信号量集合在内核中用结构sem_array表示structsem_array{structkern_ipc_permsem_perm;time_tsem_otime;/*最近一次操作时间*/time_tsem_ctime;/*最近一次的改变时间*/structsem*sem_base;/*指向第一个信号量*/structsem_queue*sem_pending;/*挂起操作队列*/structsem_queue**sem_pending_last;structsem_undo*undo;unsignedlongsem_nsems;/*信号量的个数*/};信号量集合中的每一个信号用结构sem表示structsem{intsemval;/*信号量的当前值*/intsempid;/*最近对信号