System V IPC 和 POSIX IPC 的区别
2026/8/25大约 3 分钟
Linux IPC:System V IPC 与 POSIX IPC
1. 两套 IPC 是什么
Linux 常见 IPC 有两套体系:
System V IPC POSIX IPC
│ │
├─ 消息队列 ├─ 消息队列
├─ 共享内存 ├─ 共享内存
└─ 信号量 └─ 信号量核心区别:
System V 用 Key 找对象,POSIX 用名字找对象。
2. System V IPC
前面学的:
msgget()
shmget()
semget()都属于 System V。
典型流程:
ftok()
↓
key
↓
msgget / shmget / semget
↓
IPC 对象
↓
继续操作例如共享内存:
key_t key = ftok("./file1", 'a');
int shmid = shmget(key, 2048, 0666 | IPC_CREAT);
char *p = shmat(shmid, NULL, 0);这里:
ftok() → 生成 Key
shmget() → 获取/创建共享内存
shmat() → 映射到进程地址空间3. POSIX IPC
POSIX 不使用 ftok(),而是直接使用名字:
"/myqueue"
"/myshm"
"/mysem"例如 POSIX 消息队列:
mqd_t mq = mq_open("/myqueue",
O_CREAT | O_RDWR,
0666,
NULL);流程:
"/myqueue"
↓
mq_open()
↓
消息队列所以:
System V:
ftok() → key → msgget()
POSIX:
"/myqueue" → mq_open()4. 三类 IPC 的对应关系
消息队列
System V POSIX
msgget() mq_open()
msgsnd() mq_send()
msgrcv() mq_receive()
msgctl() mq_close()/mq_unlink()共享内存
System V POSIX
shmget() shm_open()
shmat() mmap()
shmdt() munmap()
shmctl() shm_unlink()信号量
System V POSIX
semget() sem_open()
semop() sem_wait()/sem_post()
semctl() sem_close()/sem_unlink()记住:
功能对应,接口不同。
5. 为什么 POSIX 看起来更统一
System V:
msgget()
shmget()
semget()POSIX:
mq_open()
shm_open()
sem_open()POSIX 的命名方式更统一:
xxx_open()
↓
得到对应对象尤其共享内存:
shm_open()
↓
fd
↓
mmap()
↓
内存地址和 Linux 文件、Socket 的:
open() → fd思路更接近。
6. ftok() 只属于 System V 这套思路
key_t key = ftok("./file1", 'a');作用:
生成 System V IPC 使用的 Key。
然后:
msgget(key, ...);
shmget(key, ...);
semget(key, ...);POSIX 不需要:
ftok()直接:
mq_open("/myqueue", ...);
shm_open("/myshm", ...);
sem_open("/mysem", ...);7. 生命周期
System V IPC 对象可以独立于创建它的进程存在。
例如:
进程
↓
shmget()
↓
创建共享内存
↓
进程退出共享内存不一定自动消失。
因此需要:
shmctl(shmid, IPC_RMID, NULL);或者使用:
ipcrm清理。
POSIX IPC 使用命名对象,生命周期管理通常更接近:
open/create
↓
使用
↓
close
↓
unlink例如:
mq_close(mq);
mq_unlink("/myqueue");8. POSIX 就一定比 System V 好吗?
不能这么理解。
System V:
经典、成熟,大量老项目和教材仍然使用。
POSIX:
接口更现代、更统一,更适合新的 POSIX/Linux 应用开发。
所以实际学习:
System V
↓
看懂 + 会用 + 会面试
POSIX
↓
知道对应接口 + 理解现代写法9. 一个关键注意点
不要简单记成:
“POSIX IPC 都可以直接配合 epoll。”
这是不准确的。
POSIX IPC 的不同对象和事件通知机制不同,例如 POSIX 消息队列提供:
mq_notify()可以进行异步通知,但不能把所有 POSIX IPC 都简单理解成“一个普通 fd,直接丢给 epoll”。
10. 最终记忆
System V
↓
Key
↓
msgget / shmget / semget
POSIX
↓
"/name"
↓
mq_open / shm_open / sem_open最核心的对应关系:
消息队列:
System V → msgget()
POSIX → mq_open()
共享内存:
System V → shmget()
POSIX → shm_open()
信号量:
System V → semget()
POSIX → sem_open()System V 和 POSIX IPC 不是两种不同的通信原理,而是两套不同的 IPC API 体系。前者以 Key 定位对象,后者以名字定位对象。

