1.引言
有三种IPC称作XSI IPC,即消息队列、信号量以及共享存储器。
2.标识符和键
每个内核中的IPC结构都用一个非负整数的标识符加以引用。例如,对一个消息队列发送或取消息,只需要知道其队列标识符。
标识符是IPC对象的内部名。为使多个合作进程能够在同一IPC对象上会合,需要提供一个外部命名方案。为此使用键与每个IPC对象关联。键的数据类型为key_t,由内核变换成标识符。
ftok函数根据一个路径名和项目ID产生一个键。path参数必须引用一个现存文件。当产生键时,只使用id参数的低8位。
#include<sys/ipc.h>
key_t ftok(const char *path, int id);
//返回值:若成功返回键值,若出错返回(key_t)-1
三个get函数(msgget、semget、shmget)都有两个类似的参数(见各类XSI IPC):一个key和一个整形flag。如果满足下列两个条件之一,则创建一个新的IPC结构:
①key是IPC_PRIVATE。因此,为了访问一个现存队列,决不能指定IPC_PRIVATE作为键。
②key当前未与消息队列相结合,并且flag中指定了IPC_CREAT位。
为了访问一个现存的队列,决不能指定IPC_PRIVATE作为键,并且不应指定IPC_CREATE。
3.权限结构
XSIIPC为每一个IPC结构设置了一个ipc_perm结构,规定了权限和所有者。它至少包括下列成员:
struct ipc_perm {
uid_t uid; /* owner's effective user id */
gid_t gid; /* owner's effective group id */
uid_t cuid; /* creator's effective user id */
gid_t cgid; /* creator's effective group id */
mode_t mode; /* access modes */
.
.
.
};
mode字段的值类似于文件的mode字段的值,但是对于任何IPC结构都不存在执行权限(x),因此权限最大值为6。下表就是各种权限的值。
4.XSI IPC优点与缺点
XSIIPC的主要问题是,没有访问计数,因为IPC结构是在系统范围内起作用的。例如如果进程创建了一个消息队列,并在消息队列中放入几则消息,然后终止,但是该消息对列及其内容并不会被删除。这和管道,文件就不同了。所以必须要用显示的操作(msgctl、semctl、shmctl)来删除IPC结构。
另一个问题是IPC结构没有名字,不能拿IPC结构当文件进行处理,所以适用于文件的操作(read、write、close)都不能使用。所以对于IPC结构设计了特定的操作来读写。
XSIIPC的有点也有两个:
1、流是受控的,也就是说如果系统资源(缓冲区)短缺或者如果接收进程不能再接收更多消息,则发送进程就要休眠。
2、可以不采用先进先出的方式处理。比如消息队列中的每个消息都有一个消息类型属性,这个属性可以设置为优先级。