106SYSV进程间通信
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
2) 当知道 IPC 资源 ID 时,可通过 IPC 资源 ID % SEQ_MULTIPLIER 得到其在entries 数组中的 index ,从而找到相应的 IPC 资源。
3)why 保证在一段时期内 IPC资源ID 的惟 一性。
10.6.2 信号量
? 信号量是具有整数值的对象,它支持 P, V原语。进程可以利用信号量实现同步和 互斥。 ? SYSV 支持的信号量实质上是一个信号 量集合 ,由多个单独的信号量组成。我们 称SYSV 信号量为信号量集合,而单个的 信号量直接称为信号量。 ? 信号量集合在内核中用结构sem_array 表示。
两个共同参数:key 和oflag 。
key 既可由ftok ()函数产生,也可以是 IPC_PRIVATE 常量,key 值是IPC 资源的外 部表示。
oflag包括读写权限,还可以包含IPC_ CREATE和IPC_EXCL 标志位。它们组合的 效果如下:
(1)指定 key 为IPC_PRIVATE,保证创建一 个惟一的IPC 资源。
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;/* 挂起操作队列*/
(2) 设置oflag 参数的 IPC_CREATE 标志位, 但不设置IPC_EXCL 。如果相应key 的IPC 资 源不存在,则创建一个 IPC 资源,否则返回 已存在的IPC 资源。
(3)oflag 参 数 的 IPC_CREATE 和 IPC_EXCL 同时设置。如果相应 key 的IPC 资 源不存在,则创建一个 IPC 资源。否则返回 一个错误信息。
uid_t uid; /*创建者用户ID*/
gid_t gid; /*创建者组ID*/
gid_t cgid; /*所有者组ID*/
mode_t mode; /*操作权限,包括读、写等*/
unsigned long seq;
};
因 为 每 个 IPC 资 源 描 述 符 的 第 一 个 成 员 就 是 kern_ipc_perm 结构。因此,我们可以认为数组 entries 的每一非空项均指向一个 IPC 资源。
struct kern_ipc_perm* p;};
数组entries的每一项指向一个 kern_ipc_perm 结构,kern_ipc_perm 结构表示每一个 IPC资源的 属性,用来控制操作权限 。
struct kern_ipc_perm{
key_t key;/* 用户提供的键值,为XXXget ()所用*/
IPC资源ID与entries数组下标的联系: 1) 当创建一个IPC 资源时
? 调 用 函 数 ipc_addid( ) 从 相 应 ipc_ids 结 构 的
entries 数组中找出第一个未使用的项,然后返回其 下标index 。 ? 返回IPC资源ID IPC资源ID=SEQ_MULTIPLIER ×seq+index SEQ_ MULTIPLIER 是可用资源的最大数目,seq是 ipc_ids 结构中的 seq 。每当分配一个 IPC 资源时, ipc_ids 结构中的seq就增1。
10.6 SYS V 进程间通信
内容: ? 信号量; ? 消息队列; ? 共享内存。
10.6.1 三者共有的特性 IPC资源:表示单独的消息队列、共享内存 或是信号量集合。
三 者 均 有 XXXget ( ) 及 XXXctl ( ) 函 数
(XXX 代表msg ,sem ,shm 三者之一)。
1) XXXget()函数
2)XXXctl() 均 提 供 IPC_SET,IPC_STAT 和 IPC_RMID 命令。前两者用来设置或得到 IPC 资源的状态信息, IPC_RMID 用来释放 共IP同C 资的源操。作模式:
? 都是先通过 XXXget ()创建一个 IPC 资 源,返回值是该 IPC资源 ID。在以后的操作 中,均以 IPC 资源ID 为参数 ,以对相应的 IPC 资源进行操作。
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 {
int sempid;/* 最近对信号量操作进程的pid */
};
信号量的初始值可以调用函数 semctl( ) 进行设
置。
? 用户可以调用函数 semop ()对信号量集合中 的一个或多个信号量进行操作。
int semop(int semid, struct sembuf *opsptr, size_t nops);
? 别的进程可以通过 XXXget ()取得已有 的IPC 资源ID (权限允许的话)并对其操作, 从而使进程间通信成为可能。
共同的数据结构:
每一类 IPC资源都有一个 ipc_ids 结构的全局变 量用来描述同一类资源的公有数据,三个全局变量 分别是semid_ds ,msgid_ds 和shmid_ds 。
struct sem_queue **sem_pending_last;
struct sem_undo *undo;
unsigned long sem_nsems;/*信号量的个数*/
};
信号量集合中的每一个信号用结构 sem 表示:
struct sem {
int semval;/* 信号量的当前值 */
3)why 保证在一段时期内 IPC资源ID 的惟 一性。
10.6.2 信号量
? 信号量是具有整数值的对象,它支持 P, V原语。进程可以利用信号量实现同步和 互斥。 ? SYSV 支持的信号量实质上是一个信号 量集合 ,由多个单独的信号量组成。我们 称SYSV 信号量为信号量集合,而单个的 信号量直接称为信号量。 ? 信号量集合在内核中用结构sem_array 表示。
两个共同参数:key 和oflag 。
key 既可由ftok ()函数产生,也可以是 IPC_PRIVATE 常量,key 值是IPC 资源的外 部表示。
oflag包括读写权限,还可以包含IPC_ CREATE和IPC_EXCL 标志位。它们组合的 效果如下:
(1)指定 key 为IPC_PRIVATE,保证创建一 个惟一的IPC 资源。
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;/* 挂起操作队列*/
(2) 设置oflag 参数的 IPC_CREATE 标志位, 但不设置IPC_EXCL 。如果相应key 的IPC 资 源不存在,则创建一个 IPC 资源,否则返回 已存在的IPC 资源。
(3)oflag 参 数 的 IPC_CREATE 和 IPC_EXCL 同时设置。如果相应 key 的IPC 资 源不存在,则创建一个 IPC 资源。否则返回 一个错误信息。
uid_t uid; /*创建者用户ID*/
gid_t gid; /*创建者组ID*/
gid_t cgid; /*所有者组ID*/
mode_t mode; /*操作权限,包括读、写等*/
unsigned long seq;
};
因 为 每 个 IPC 资 源 描 述 符 的 第 一 个 成 员 就 是 kern_ipc_perm 结构。因此,我们可以认为数组 entries 的每一非空项均指向一个 IPC 资源。
struct kern_ipc_perm* p;};
数组entries的每一项指向一个 kern_ipc_perm 结构,kern_ipc_perm 结构表示每一个 IPC资源的 属性,用来控制操作权限 。
struct kern_ipc_perm{
key_t key;/* 用户提供的键值,为XXXget ()所用*/
IPC资源ID与entries数组下标的联系: 1) 当创建一个IPC 资源时
? 调 用 函 数 ipc_addid( ) 从 相 应 ipc_ids 结 构 的
entries 数组中找出第一个未使用的项,然后返回其 下标index 。 ? 返回IPC资源ID IPC资源ID=SEQ_MULTIPLIER ×seq+index SEQ_ MULTIPLIER 是可用资源的最大数目,seq是 ipc_ids 结构中的 seq 。每当分配一个 IPC 资源时, ipc_ids 结构中的seq就增1。
10.6 SYS V 进程间通信
内容: ? 信号量; ? 消息队列; ? 共享内存。
10.6.1 三者共有的特性 IPC资源:表示单独的消息队列、共享内存 或是信号量集合。
三 者 均 有 XXXget ( ) 及 XXXctl ( ) 函 数
(XXX 代表msg ,sem ,shm 三者之一)。
1) XXXget()函数
2)XXXctl() 均 提 供 IPC_SET,IPC_STAT 和 IPC_RMID 命令。前两者用来设置或得到 IPC 资源的状态信息, IPC_RMID 用来释放 共IP同C 资的源操。作模式:
? 都是先通过 XXXget ()创建一个 IPC 资 源,返回值是该 IPC资源 ID。在以后的操作 中,均以 IPC 资源ID 为参数 ,以对相应的 IPC 资源进行操作。
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 {
int sempid;/* 最近对信号量操作进程的pid */
};
信号量的初始值可以调用函数 semctl( ) 进行设
置。
? 用户可以调用函数 semop ()对信号量集合中 的一个或多个信号量进行操作。
int semop(int semid, struct sembuf *opsptr, size_t nops);
? 别的进程可以通过 XXXget ()取得已有 的IPC 资源ID (权限允许的话)并对其操作, 从而使进程间通信成为可能。
共同的数据结构:
每一类 IPC资源都有一个 ipc_ids 结构的全局变 量用来描述同一类资源的公有数据,三个全局变量 分别是semid_ds ,msgid_ds 和shmid_ds 。
struct sem_queue **sem_pending_last;
struct sem_undo *undo;
unsigned long sem_nsems;/*信号量的个数*/
};
信号量集合中的每一个信号用结构 sem 表示:
struct sem {
int semval;/* 信号量的当前值 */