Nor*_*sey 5 posix message-queue
我正在开发一个简单的并行应用程序,我想在其中使用单个进程来维护有关一系列工作进程的状态信息.设置POSIX消息队列似乎相对容易,其中所有工蜂都可以定期向状态维护者发送更新.我的问题?POSIX消息队列必须具有名称.我不想选一个名字; 所有我关心的是获得一个独特的消息队列,就像我使用SYSV消息队列一样IPC_PRIVATE
.对于我可以使用的唯一文件名mkstemp(3)
或我可以使用的唯一打开文件描述符tmpfile(3)
. 我应该如何获得唯一的POSIX消息队列?
我不想选择一个名字;我所关心的是获得一个唯一的消息队列,就像我将 SYSV 消息队列与 IPC_PRIVATE 一起使用一样
嗯,对于 POSIX 消息队列,您必须指定一个名称,但您不必保留它,也不必允许其他人通过该名称使用相同的队列。
IPC_PRIVATE模仿
做什么mkstemp
,tmpfile
在幕后做什么。借用任何“tmp”/“temp”名称选择算法来生成一些“/reasonously_unique”,mq_open
即 O_CREAT|O_EXCL,然后是mq_unlink
它。然后子工作进程可以继承消息队列描述符。
警告:root 或您的 EUID 是否会发现您在做什么并在 和 之间mq_open
跳转mq_unlink
?是的。
替代实施
或者,使用 SOCK_DGRAMsocketpair
或pipe
代替。这些提供了与 POSIX 消息队列类似的语义 -attr.mq_msgsize
成为 SO_SNDBUF/SO_RCVBUF 或尊重 PIPE_BUF 的协议,mq_notify
成为 I/O 选择性(可能已经是这种情况) - 尽管你确实失去了消息优先级。