POSIX 消息队列机制与实现详解

POSIX 消息队列机制与实现详解

源码路径rk3588/kernel-6.1/ipc/mqueue.cmq_sysctl.c
文档目录linuxDoc/ipc/


目录


一、原理

POSIX 消息队列路径名 标识(挂载 mqueue 文件系统),每条消息带 优先级

  • mq_open 创建/打开队列(O_CREAT
  • mq_timedsend / mq_timedreceive
  • mq_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_maxmsgsize_maxmsg_max 等( per ipc_namespace)。


四、文件系统与系统调用

syscall 功能
mq_open / mq_unlink 创建/删除队列 inode
mq_timedsend / mq_timedreceive 带超时收发
mq_notify 注册 sigevent
mq_getsetattr 属性

msgutil.o 与 SysV 共用:全局 init_ipc_nsmq_lock


五、调试

1
2
3
mount -t mqueue none /dev/mqueue   # 若未挂载
ls /dev/mqueue
cat /proc/sys/fs/mqueue/*

附录

相关06 命名空间

文章互动

阅读 --

留言

0 条留言

正在加载留言…