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