概述
Posix IPC含有以下三种类型的IPC:
- Posix消息队列(mqueue)
- Posix信号量(semaphore)
- Posix共享内存区(mman)
Posix IPC具有的共同属性:用于标识的路径名、打开或创建时指定的标志及访问权限。
消息队列 | 信号量 | 共享内存区 | |
---|---|---|---|
头文件 | <mqueue.h> | <semaphore.h> | <sys/mman.h> |
创建、打开或删除IPC的函数 | mq_open mq_close mq_unlink | sem_open sem_close sem_unlink sem_init sem_destroy | shm_open shm_unlink |
控制IPC操作的函数 | mq_getattr mq_setattr | ftruncate fstat | |
IPC操作函数 | mq_send mq_receive mq_notify | sem_wait sem_trywait sem_post sem_getvalue | mmap munmap |
IPC名字
在使用Posix IPC接口创建IPC时,mq_open、sem_open和shm_open的第一个参数用于指定创建的IPC名字。
Posix标准规定IPC的名字必须以一个斜杠符开始,并且不能再包含有任何其他斜杠符
IPC的名字规定不同系统中有不同的实现,在使用时需要考虑可移植性问题。
创建与打开IPC通道
mq_open、sem_open和shm_open用于创建或打开一个IPC对象的函数。这三个函数的第二个参数指定怎么样打开所请求的对象。与open函数的第二个参数类型。
说明 | mq_open | sem_open | shm_open |
---|---|---|---|
只读 只写 读写 | O_RDONLY O_WRONLY O_RDWR | O_RDONLY O_RDWR | |
若不存在则创建 排他性创建 | O_CREAT O_EXCL | O_CREAT O_EXCL | O_CREAT O_EXCL |
非阻塞模式 若已存在则截短 | O_NONBLOCK | O_TRUNC |
前三行指定怎样打开对象:只读、只写或读写。消息队列mq能以其中任何一种模式打开,信号量的打开不能指定任何模式(任意信号量操作,都需要读写访问权),共享内存对象则不能以只写模式打开。
IPC权限
(略)
小结
三种类型的Posix IPC ----- 消息队列、信号量、共享内存区--------都是用路径名进行标识。路径名既可以是文件系统中实际的路径名,也可以不是,这一点需要在使用时注意可移植性问题。
当创建或打开一个IPC对象时,需要指定创建或打开IPC对象的方式(open函数所用的标志),创建一个新的IPC对象时,必须给对象指定访问权限(open函数使用的S_xxx常值)。打开一个已存在的IPC对象时,所执行的权限测试与打开一个已存在的文件时一样。
参考资料
《UNIX网络编程-卷2-进程间通信》