POSIX 进程间通信 (interprocess communication, IPC) 是 System V 进程间通信的变体。 它是在 Solaris 7 发行版中引入的。 与 System V 对象类似,POSIX IPC 对象的属主、属主的组以及其他用户具有读取和写入权限,但是没有执行权限。 POSIX IPC 对象的属主无法将对象分配给其他属主。 POSIX IPC 包括以下功能:
消息允许进程将已格式化的数据流发送到任意进程。
信号量允许进程同步执行。
共享内存允许进程共享其部分虚拟地址空间。
与 System V IPC 接口不同,POSIX IPC 接口均为多线程安全接口。
下表中列出了 POSIX 消息队列接口。
表 6–2 POSIX 消息队列接口
接口名称 |
目的 |
---|---|
连接到以及创建(可选)命名消息队列 |
|
结束到开放式消息队列的连接 |
|
结束到开放式消息队列的连接,并在最后一个进程关闭此队列时将其删除 |
|
将消息放入队列 |
|
在队列中接收(删除)最早且优先级最高的消息 |
|
通知进程或线程消息已存在于队列中 |
|
设置或获取消息队列属性 |
POSIX 信号量比 System V 信号量轻得多。 POSIX 信号量结构定义单个信号量,而不是定义最多包含 25 个信号量的数组。
POSIX 信号量接口如下所示。
连接到以及创建(可选)命名信号量
初始化信号量结构(在调用程序内部,因此不是命名信号量)
结束到打开信号量的连接
结束到打开信号量的连接,并在最后一个进程关闭此信号量时将其删除
销毁信号量结构(在调用程序内部,因此不是命名信号量)
将信号量的值复制到指定整数中
当其他进程拥有信号量时进行阻塞,或者当其他进程拥有信号量时返回错误
递增信号量计数
POSIX 共享内存实际上是映射内存的变体(请参见创建和使用映射)。 二者的主要差异在于:
打开共享内存对象应使用 shm_open(3RT),而不是通过调用 open(2)。
关闭和删除对象应使用 shm_unlink(3RT),而不是通过调用 close(2),此调用不删除对象。
shm_open(3RT) 中的选项数实际上少于 open(2) 中提供的选项数。