系统 V 和 Posix


下表列出了 System V IPC 和 POSIX IPC 之间的差异。

系统V POSIX
AT&T (1983) 引入了三种新形式的 IPC 设施,即消息队列、共享内存和信号量。 IEEE 指定的可移植操作系统接口标准来定义应用程序编程接口 (API)。POSIX涵盖了IPC的所有三种形式
SYSTEM V IPC 涵盖了所有 IPC 机制,即管道、命名管道、消息队列、信号、信号量和共享内存。它还涵盖套接字和 Unix 域套接字。 几乎所有的基本概念与System V相同。只是接口不同
共享内存接口调用 shmget()、shmat()、shmdt()、shmctl() 共享内存接口调用 shm_open()、mmap()、shm_unlink()
消息队列接口调用msgget()、msgsnd()、msgrcv()、msgctl() 消息队列接口调用 mq_open()、mq_send()、mq_receive()、mq_unlink()
信号量接口调用 semget()、semop()、semctl() 信号量接口调用 命名信号量 sem_open()、sem_close()、sem_unlink()、sem_post()、sem_wait()、sem_trywait()、sem_timedwait()、sem_getvalue() 未命名或基于内存的信号量 sem_init()、sem_post()、sem_wait ()、sem_getvalue()、sem_destroy()
使用键和标识符来标识 IPC 对象。 使用名称和文件描述符来识别 IPC 对象
不适用 可以使用 select()、poll() 和 epoll API 监控 POSIX 消息队列
提供 msgctl() 调用 提供函数(mq_getattr() 和 mq_setattr())来访问或设置属性 11. IPC - System V & POSIX
不适用 多线程安全。涵盖互斥锁、条件变量、读写锁等线程同步功能。
不适用 为消息队列提供一些通知功能(例如 mq_notify())
需要系统调用,例如 shmctl()、命令(ipcs、ipcrm)来执行状态/控制操作。 可以使用 fstat()、fchmod() 等系统调用来检查和操作共享内存对象
System V 共享内存段的大小在创建时是固定的(通过 shmget()) 我们可以使用 ftruncate() 调整底层对象的大小,然后使用 munmap() 和 mmap() (或 Linux 特定的 mremap())重新创建映射