1. System V IPC
- System V 消息队列
- System V 信号量
- System V 共享内存区
System V IPC函数汇总
消息队列 | 信号量 | 共享内存区 | |
---|---|---|---|
头文件 | <sys/msg.h> | <sys/sem.h> | <sys/shm.h> |
创建或打开IPC的函数 | msgget | semget | shmget |
控制IPC操作的函数 | msgctl | semctl | shmctl |
IPC操作函数 | msgsend msgrcv | semop | shmat shmdt |
2. key_t键和ftok函数
System V IPC使用key_t值作为它们的名字,它通常是至少32位的整数(由<sys/types.h>定义)。而这些整数值通常是由ftok函数赋予。
-
函数ftok把一个已存在的路径名和一个整数标识符(使用其低序8位)转换成一个key_t值,称为IPC键。
#include <sys/ipc.h> key_t ftok(const char *pathname,int id); //返回:成功则为IPC键,否则为-1
-
该函数假定对于使用System V IPC的某个应用而言,客户和服务器同意使用对该应用有一定意义的pathname [服务器守护程序的路径名、服务器使用的某个公共数据文件路径名、系统某个其他路径名] 。
Note:路径名用于产生键的文件不能是在服务器存货期间由服务器反复创建并删除的文件,因为该文件每次创建时由系统赋予的索引节点很可能不一样,于是对下一个调用者来说,由ftok返回的键也可能不同。
-
若客户和服务器之间只需单个IPC通道,则可以使用如id=1;若需多个IPC通道,如client->server && server->client,则一个通道可使用id=1,另一个通道可使用id=2。
-
一旦client和server在pathname和id上达成一致,则双方调用ftok函数把pathname和id转换成同一个IPC键。
3. ipc_perm结构——维护IPC对象信息结构
其内容跟内核给文件维护的信息类似。
struct ipc_perm {
uid_t uid; //owner用户id
gid_t gid; //owner组id --合称为owner ID
uid_t cuid; //creator用户id
gid_t cgid; //creator组id --合称为creator ID
mode_t mode; //读-写权限
ulong_t seq; //slot使用序列号
key_t key; //IPC key
}
- 创建与打开IPC通道
- 指定key为IPC_PRIVATE能保证创建一个唯一的IPC对象。没有一对id和pathname的组合会导致ftok产生IPC_PRIVATE这个键值;
- 设置oflag参数的IPC_CREAT位但不设置它的IPC_EXCL位时,如果所指定键的IPC对象不存在,那就创建一个新的对象,否则返回该对象;
- 同时设置oflag参数的IPC_CREAT位和IPC_EXCL位时,若所指定键的IPC对象不存在,则创建一个对象;否则返回EEXIST错误。
5. 习题
- 3.4 如果一个服务器想要为其客户创建一个唯一的消息队列,那么采用哪种方法更恰当——使用某个常值路径名(如可执行文件)作为ftok的一个参数呢,还是使用IPC_PRIVATE?
1)若使用ftok,系统中另外某个路径名所形成的键与服务器所用的键相同的可能性总是存在。2)若使用IPC_PRIVATE,服务器尽管知道它是在创建新的消息队列,但她必须接着把所创建消息队列的标识符写到某文件中,供客户读取。