51 POSIX IPC 介绍
总体来说,POSIX IPC 的接口比 System V IPC 更简单,而且使用方式也更贴近文件。
- POSIX IPC 对象名字需要是类似于 /myobject 的、以斜线开头后面跟非斜线字符的字符串。字符串长度受到 NAME_MAX 限制(255 个字符)。信号量的名字还要少 4 个,因为会增加前缀
sem.
。如果不以 / 开头,则是实现定义。IPC 对象名字很像一个根目录下的文件的绝对路径,在有些实现上,IPC 对象真的被放在文件系统上。 - 创建和打开 IPC 对象很像创建或打开文件。
- POSIX IPC 对象有引用计数,进程退出或者关闭 IPC 对象后引用计数就会减少。进程调用
exec()
后 POSIX IPC 对象也会被关闭(很像文件有 close-on-exec 标记)。{mq,sem,shm}_unlink()
可以用来删除 POSIX IPC 对象,已经打开了 IPC 对象的进程仍能继续使用它们。而 System V 的删除(除了共享内存)是立即生效的,进程的后续访问会出错。 - 持久性:和 System V IPC 一样,POSIX IPC 对象也有内核持久性(如果不显式删除,将会持续到系统关机)。
- IPC 对象管理:System V IPC 可以用
ipcs
来列出 IPC 对象,用ipcrm
来删除 IPC 对象。POSIX IPC 没有这样标准化的命令。Linux 上的 POSIX IPC 对象被挂载在虚拟文件系统上,其所在目录有粘滞位,可以用 ls(1) 和 rm(1) 这样的标准命令来操作 Linux 的 POSIX IPC 对象。 - System V IPC 更古老,可移植性更强。
- System V IPC 用 key 来访问,本质都是命名的;POSIX 信号量可以匿名也可以命名;POSIX 用
shm_open
创建共享内存是命名的,但用 mmap 也可以创建匿名共享内存(mmap 也是 POSIX 标准);POSIX 消息队列是命名的。