XSI IPC
参考: https://www.cnblogs.com/nufangrensheng/p/3561681.html
http://blog.youkuaiyun.com/todd911/article/details/19035271
XSI ipc 有: 消息队列,信号量,共享存储。
一、标识符和键
1、标识符:是内核中ipc对象的内部名。
内核中每种ipc结构里都有一个非负整数的标识符(identifier)。
2、键: 是ipc的外部对象。数据类型:key_t, 键值会被内核处理为标识符。
为了让应用层的合作进程能够访问同一个ipc对象,需要在应用层定义一个键(key)来关联。
3、让客户进程与服务进程汇集到同一个ipc对象的方法:
a: 用键IPC_PRIVATE
服务进程用IPC_PRIVATE创建ipc结构,返回的标识符存到文件,客户进程来取。
b: 宏-->定义客/服进程都认可的键
在头文件中定义公认的键,服务进程用该键创建ipc结构。
缺点:键可能在之前就已和别的ipc对象结合,再次创建会导致get出错。需删除原ipc对象在创建。
c: 用ftok接口将 路径、id 变换出键。id(0---255)
key_t ftok(const char *path, int id); ftok 创建键后,再让服务器创建ipc结构.
注: path 是一个现有文件,id只能使用低8位.
创建方式: path中取出stat结构中的st_dev与st_ino, 然后将它们与项目id结合生成键。
缺点: i节点与键都存放在长整型中,创建的键可能会丢失,导致同一个项目下,不同的路径ftok产生相同键。
4、msgget,semget,shmget接口:
参数: key + flag
创建一个新的ipc结构: 在flag中指定IPC_CREAT和IPC_EXCL位;
若创建一个已存在的ipc将会出错:返回EEXIST;
二、IPC 结构权限
XSI IPC 为每个ipc关联了ipc_perm结构,该结构规定了权限和所有者。
ipc_perm 结构定义于中,原型如下:
struct ipc_perm
{
key_t key; 调用shmget()时给出的关键字
uid_t uid; /*共享内存所有者的有效用户ID */
gid_t gid; /* 共享内存所有者所属组的有效组ID*/
uid_t cuid; /* 共享内存创建者的有效用户ID*/
gid_t cgid; /* 共享内存创建者所属组的有效组ID*/
unsigned short mode; /* Permissions + SHM_DEST和SHM_LOCKED标志*/
unsignedshort seq; /* 序列号*/
};
调用函数(semget msgget shmget)创建ipc时,会对ipc_perm结构赋值。如修改则调用控制函数(msgctl semctl shmctl)。
注意:只有超级用户或者创建IPC对象的进程有权改变ipc_perm结构的值。
结构中的mode域类似于文件的stat结构的mode域,但是不可以有执行权限。
表14-3 ipc_perm的mode详解表
操作者 | 读 | 写(更改更新) | 操作者 | 读 | 写(更改更新) |
用户 | 0400 | 0200 | 其他 | 0004 | 0002 |
组 | 0040 | 0020 |
|
|
|
三、通过重新配置内核可以修改XSI IPC的结构限制。
四、优缺点
缺点1:IPC结构是在系统范围内起作用的,没有访问计数。
例如,如果进程创建了一个消息队列,在该队列中放入了几条消息,然后终止,但是消息队列及其内容并不会被删除。
除非出现下述情况:
a、某个进程调用msgrcv或msgctl读消息或删除消息队列;
b、某个进程执行ipcrm(1)命令删除消息队列;
c、由正在再启动的系统删除消息队列。
与管道相比:
管道: 当最后一个访问管道的进程终止时,管道就被完全地删除。
FIFO: 当最后一个引用FIFO的进程终止时其名字仍保留在系统中,直至显示地删除时,
留在FIFO中的数据才全部被删除。
缺点2:这些IPC结构在文件系统中没有名字。
不能用文件I/O和文件和目录章节中所述的函数来访问它们或修改它们的特性。
为了支持它们不得不增加了十几条全新的系统调用(msgget、semop、shmat等)。
表现:
a、不能用ls命令见到IPC对象;
b、不能用rm命令删除它们;
c、也不能用chmod命令更改它们的访问权限。于是,就不得不增加新的命令ipcs(1)和ipcrm(1);
d、IPC不使用文件描述符,不能对它们使用多路转接I/O函数:select和poll。这使得难于一次使用多个IPC结构,
以及在文件或设备I/O中使用IPC结构。
优点:1.可靠,2.流是受控的,3.面向记录,4.可以用非先进先出方式处理。