1. 概述
- Posix IPC 包括:Posix消息队列、Posix信号量、Posix共享内存区
- Posix IPC在访问它们的函数和描述它们的信息上有一些类似点。
本章讲述所有这些共同属性:用于标识的路径名、打开或创建时指定的标志、访问权限。
-
Posix IPC 函数汇总
2. IPC名字
- 三种类型的Posix IPC都使用“Posix IPC名字”进行标识。mq_open、sem_open、shm_open这三个函数的第一个参数就是这样的一个名字。
- 对于Linux,Posix IPC名字必须以一个斜杠符打头,且不能再含有任何其他斜杠符。
- 对于Linux,创建的三种Posix IPC对象分别位于/dev/mqueue/mqname、/dev/shm/sem.semname、/dev/shm/shmname
- Posix.1定义了三个宏,它们的单个参数是指向某个stat结构的指针,其内容由fstat、lstat、stat这三个函数填入
- S_TYPEISMQ(buf)、S_TYPEISSEM(buf)、S_TYPEISSHM(buf)
- 测试某个文件是否为给定文件类型的所有其他宏的名字都以S_IS开头,且它们的单个参数是某个stat结构的st_mode成员。
3. 创建和打开IPC通道
- 前3行指定怎样打开对象:只读、只写、读写
- 消息队列能以其中任何一种模式打开
- 信号量的打开不指定任何模式(任意信号量操作,都需要读写访问权)
- 共享内存区对象则不能以只写模式打开
-
余下4行标志是可选的
- O_CREAT,若不存在则创建,需要指定另外的mode参数来指定权限位。指定的权限位受当前进程的文件模式创建掩码umask修正。对于其用户ID,三者都被设置为当前进程的有效用户ID;而对于其组ID,新消息队列对象被设置为当前进程的有效组ID,新信号量或共享内存区对象被设置为当前进程的有效组ID或某个系统默认组ID。
- O_EXCL,和O_CREAT标志一起指定。不存在则创建;已存在则返回EEXIST错误
- O_NONBLOCK,该标志使得一个消息队列在队列为空时的读或队列为满时的写不被阻塞
- O_TRUNC,如果以读写模式打开了一个共享内存对象,那么该标志将使得该对象的长度为0
下图展示了打开一个IPC对象的真正逻辑流程
4. IPC 权限
5. 小结
- Posix IPC名字
- 创建一个新的IPC对象时,指定访问权限
- 打开一个已存在的IPC对象时,所执行的权限测试与打开一个已存在的文件时一样
- O_CREAT,若不存在则创建,需要指定另外的mode参数来指定权限位。指定的权限位受当前进程的文件模式创建掩码umask修正。对于其用户ID,三者都被设置为当前进程的有效用户ID;而对于其组ID,新消息队列对象被设置为当前进程的有效组ID,新信号量或共享内存区对象被设置为当前进程的有效组ID或某个系统默认组ID。