当前位置:文档之家› 106Linux操作系统SYSV进程间通信.pptx

106Linux操作系统SYSV进程间通信.pptx

两个共同参数:key和oflag。
key 既 可 由 ftok ( ) 函 数 产 生 , 也 可 以 是 IPC_PRIVATE常量,key值是IPC资源的外部表 示。
oflag包括读写权限,还可以包含IPC_CREATE和 IPC_EXCL标志位。它们组合的效果如下: (1)指定key为IPC_PRIVATE保证创建一个唯 一的IPC资源。 (2)设置oflag参数的IPC_CREATE标志位但不 设置IPC_EXCL。如果相应key的IPC资源不存在, 则创建一个IPC资源,否则返回已存在的IPC资源。
struct kern_ipc_perm* p;};
数组entries的每一项指向一个kern_ipc_perm 结构,kern_ipc_perm结构表示每一个IPC资源的 属性,用来控制操作权限。
struct kern_ipc_perm{ key_t key;/*用户提供的键值,为XXXget()所用*/ uid_t uid; /*创建者用户ID*/ gid_t gid; /*创建者组ID*/ uid_t cuid; /*所有者用户ID*/ gid_t cgid; /*所有者组ID*/ mode_t mode; /*操作权限,包括读、写等*/ unsigned long seq; };
(3)oflag参数的IPC_CREATE和IPC_EXCL同 时设置。如果相应key的IPC资源不存在,则创 建一个IPC资源。否则返回一个错误信息。
(b)XXXctl() 均提供IPC_SET、IPC_STAT和 IPC_RMID命令。前两者用来设置或得到IPC资源 的状态信息,IPC_RMID用来释放IPC资源。
IPC资源ID = SEQ_MULTIPLIER * seq + index
SEQ_MULTIPLIER是可用资源的最大数目,seq 是ipc_ids结构中的seq。每当分配一个IPC资源 时,ipc_ids结构中的seq就增一。 (2)当知道IPC资源ID时,可通过
IPC资源ID % SEQ_MULTIPLIER 得到 其 在 entries 数组 中 的 index ,从 而找到相应的 IPC资源。 (3)why 保证在一段时期内IPC资源ID的唯一性
semid : IPC资源ID opsptr: 操作的集合 nops: 数组opsptr的大小
因 为 每 个 IPC 资 源 描 述 符 的 第 一 个 成 员 就 是 kern_ipc_perm结构。因此,我们可以认为数组 entries 的每一非空项均指向一个IPC资源。
IPC资源ID与entries数组下标的联系 (1)当创建一个IPC资源时, •调 用 函 数 ipc_addid() 从 相 应 ipc_ids 结 构 的 entries数组中找出第一个未使用的项然后返回其 下标index。 •返回IPC资源ID
struct ipc_ids { int size; /* entries数组的大小*/ int in_use; /* entries数组已使用的元素个数*/ int max_id; unsigned short seq; unsigned short seq_max; truct semaphore sem; /*控制对ipc_ids结构的访问*/ spinlock_t ary;/*自旋锁控制对数组entries的访问*/ struct ipc_id* entries; }; struct ipc_id {
struct sem_queue **sem_pending_last;
struct sem_undo *undo;
unsigned long sem_nsems;/*信号量的个数*/
};
信 号 量 集 合 中 的 每 一 个 信 号 用 结 构 sem 表 示 ,
struct sem {
int semval;/* 信号量的当前值 */
10.6 SYS V 进程间通信
内容 • 信号量 • 消息队列 • 共享内存
10.6.1 三者共有的特性 IPC资源 表示单独的消息队列、共享内存或是 信号量集合
三 者 均 有 XXXget ( ) 及 XXXctl ( ) 函 数 (XXX代表msg、sem、shm三者之一)
(a) XXXget()函数
int sempid;/* 最近对信号量操作进emctl()进行设
置。
•用户可以调用函数semop()对信号量集合中 的一个或多个信号量进行操作。
int semop(int semid, struct sembuf *opsptr, size_t nops);
10.6.2 信号量 •信号量是具有整数值的对象,它支持P、V原语。 进程可以利用信号量实现同步和互斥 •SYSV支持的信号量实质上是一个信号量集合,由 多个单独的信号量组成。我们称SYSV信号量为 信号量集合,而单个的信号量直接称为信号量。 •信号量集合在内核中用结构sem_array表示
struct sem_array {
struct kern_ipc_perm sem_perm;
time_t sem_otime;
/* 最近一次操作时间 */
time_t sem_ctime;
/* 最近一次的改变时间 */
struct sem *sem_base; /*指向第一个信号量 */
struct sem_queue *sem_pending;/* 挂起操作队列*/
共同的操作模式
•都是先通过XXXget()创建一个IPC资源,返回 值是该IPC资源ID。在以后的操作中,均以IPC资 源ID为参数以对相应的IPC资源进行操作。
•别的进程可以通过XXXget()取得已有的IPC资 源ID(权限允许的话)到并对其操作,从而进程 间通信成为可能。
共同的数据结构
每一类IPC资源都有一个ipc_ids结构的全局变 量用来描述同一类资源的公有数据,三个全局变 量分别是semid_ds,msgid_ds和shmid_ds。
相关主题