POSIX IPC 深入解析
1. 消息队列移除机制
当使用msgctl(2)并带上IPC_RMID标志时,意味着调用者希望从系统中移除消息队列。此时,内核会遍历队列上的消息链表,释放与每个消息关联的内核资源。同时,内核会向在该消息队列上睡眠的进程(线程)发送唤醒信号,这些进程最终会收到EIDRM错误(ID 已移除)。最后,系统会将msqid_ds结构标记为可用并返回。
2. POSIX IPC 概述
POSIX 标准及其相关应用程序编程接口(APIs)的发展产生了一组行业标准接口,这些接口提供了与 System V IPC 集相同类型的功能,包括共享内存、信号量和消息队列。它们在形式和功能上与 System V 的同类产品非常相似,但实现方式却大不相同。
POSIX 对这三种 IPC 设施的实现基于 POSIX IPC 名称的概念,这些名称本质上看起来像文件名,但不一定是文件系统中的实际文件。这种 POSIX 名称约定提供了必要的抽象,即文件描述符,以便使用 Solaris 文件内存映射接口mmap(2),而所有 POSIX IPC 机制都是基于此构建的。这与 System V IPC 函数有很大不同,在 System V IPC 中,需要一个键值来获取所需 IPC 资源的正确标识符,常用的生成键值的方法是ftok(3C)(文件到键)函数,该函数根据文件的路径名生成键值。而 POSIX 消除了键的使用,进程通过文件名约定来获取所需资源。