POSIX 消息队列机制与实现详解
源码路径:
rk3588/kernel-6.1/ipc/mqueue.c、mq_sysctl.c
文档目录:linuxDoc/ipc/
目录
一、原理
POSIX 消息队列由 路径名 标识(挂载 mqueue 文件系统),每条消息带 优先级:
mq_open创建/打开队列(O_CREAT)mq_timedsend/mq_timedreceivemq_notify:异步通知(signotify 或 线程唤醒)mq_getattr/mq_setattr:队列深度、消息大小等
依赖 CONFIG_POSIX_MQUEUE 且 Kconfig 要求 depends on NET(历史依赖,实现使用 netlink 相关基础设施做通知)。
二、与 SysV 消息队列对比
| 维度 | SysV (msg.c) |
POSIX (mqueue.c) |
|---|---|---|
| 标识 | key / id | 路径名 |
| 优先级 | type 字段 | 显式 unsigned prio |
| 接口 | msgsnd/msgrcv |
mq_* |
| 可见性 | ipcs |
ls /dev/mqueue(挂载点可配置) |
| 实现文件 | msg.c |
VFS + inode |
三、实现要点
3.1 核心结构(mqueue.c)
struct mqueue_inode_info:红黑树按 priority 组织消息、等待队列posix_msg_tree_node:每优先级一条链表- 锁:
info->lock;唤醒用wake_q+ MQ_BARRIER(注释详述 UAF 竞态防护)
3.2 命名空间
mq_init_ns:挂载mqueue、初始化mq_queues_max等mq_put_mnt:释放 namespace 时卸载
3.3 sysctl(mq_sysctl.c)
典型 fs.mqueue.*:queues_max、msgsize_max、msg_max 等( per ipc_namespace)。
四、文件系统与系统调用
| syscall | 功能 |
|---|---|
mq_open / mq_unlink |
创建/删除队列 inode |
mq_timedsend / mq_timedreceive |
带超时收发 |
mq_notify |
注册 sigevent |
mq_getsetattr |
属性 |
msgutil.o 与 SysV 共用:全局 init_ipc_ns、mq_lock。
五、调试
1 | mount -t mqueue none /dev/mqueue # 若未挂载 |
附录
相关:06 命名空间
正在加载留言…