系统 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())重新创建映射 |