System V IPC包含三种类型的IPC:System V消息队列、System V信号量、System V共享内存区服务器
1. key_t键和ftok函数函数
三种类型的System V IPC使用key_t值做为名字。头文件<sys/types.h>定义key_t为一个至少32位的整数。函数ftok把一个已存在的路径名和一个整数标识符转换成一个key_t值,称为IPC键测试
#include <sys/ipc.h> key_t ftok(const char *pathname, int id);ui
ftok的典型实现调用stat函数,而后组合三个值:stat结构的st_dev信息、stat结构的st_info信息、id的低序8位(不能为0)。不能保证不一样的路径名与同一个id的组合产生不一样的键。spa
2. ipc_perm结构code
内核给每一个IPC对象维护一个信息结构,内容跟内核给文件维护的信息相似对象
struct ipc_perm { uid_t uid; /* owner’s user id */ gid_t gid; /* owner’s group id */ uid_t cuid; /* creator’s user id */ gid_t cgid; /* creator’s group id */ mode_t mode; /* read-write permissions */ ulong_t seq; /* slot usage sequence number */ key_t key; /* IPC key */ };
3. 建立于打开IPC通道队列
建立或打开一个IPC对象的三个getXXX函数的第一个参数key有两种选择:调用ftok,传递pathname和id;指定key为IPC_PRIVATE,保证建立一个新的、惟一的IPC对象。System V IPC定义了本身的IPC_xxx常值进程
#include <sys/ipc.h> <sys/shm.h> int shmget(key_t key, size_t size, int oflag); #include <sys/types.h> <sys/ipc.h> <sys/sem.h> int semget(key_t key, int nsems, int oflag); #include <sys/types.h> <sys/ipc.h> <sys/msg.h> int msgget(key_t key, int oflag);
4. IPC权限ip
oflag参数某些位初始化ipc_perm结构的mode成员
一个进程可经过调用相应IPC机制ctlXXX函数(IPC_SET)修改属主ID,建立者ID却从不改变。三个ctlXXX函数容许一个进程修改某个IPC对象的mode成员。
每当有一个进程访问某个IPC对象,IPC执行两级检查:IPC对象被打开时执行一次,每次使用对象时执行一次
每当有一个进程以getXXX函数创建访问某个存在IPC对象的通道时,IPC执行一次初始检查,验证调用者的oflag参数没有指定不在该对象ipc_perm结构mode成员中的任何访问位。建立者和调用者的权限位一致。绕过这种检查的方法:若是已知IPC对象存在,指定一个值为0的oflag参数。
每次IPC操做都对使用该操做的进程执行一次权限测试:超级用户老是赋予访问权;若是当前进程的有效用户ID等于IPC对象的uid或cuid,并且相应的访问位(若是调用者要在IPC对象执行读操做,那么读位必须设置,若是要执行写操做,那么写位必须设置)在IPC对象的mode成员是打开的。
若是当前进程的有效组ID等于IPC对象的gid或cgid,并且相应访问位在IPC对象mode成员中是打开的
若是上面的测试没有一个为真,那么相应的“其余用户”访问位在IPC对象的mode成员中必须是打开的
5. 标识符重用
ipc_perm结构的seq变量是一个槽位使用状况序列号,一个由内核为系统每一个潜在的IPC对象维护的计数器。每当删除一个IPC对象,内核就递增相应的槽位号,若溢出则循环回0。System V IPC标识符是系统范围的,不是特定于进程的。从某个getXXX函数得到一个IPC标识符适用于全部进程。可能致使某些进程尝试不一样的小整数标识符,期待找出一个当前容许你们读访问的消息队列。解决办法是把标识符值可能范围扩大到全部整数:每次重用一个IPC表项,把返回给调用者的标识符值增长一个IPC表项数。递增槽位使用状况序列号的另外一个缘由是避免短期内重用System V IPC标识符,有助于确保过早终止的服务器从新启动后不会重用标识符。
6. ipcs和ipcrm程序
因为System V IPC的三种类型不是以文件系统中的路径名标识的,提供两个特殊程序ipcs和ipcrm。ipcs输出有关System V IPC特性的各类信息,ipcrm删除一个System V消息队列、信号量或共享内存区