我正在处理一个简单的并行应用程序,在这个应用程序中,我想使用一个进程来维护一组工作进程的状态信息。设置一个POSIX消息队列似乎相对容易,在这个队列中,所有的工蜂都可以定期向状态维护者发送更新。我的问题吗?POSIX消息队列必须有一个名称。我不想取名字;我所关心的是获得一个唯一的消息队列,就像我在IPC_PRIVATE
中使用SYSV消息队列一样。对于唯一的文件名,我可以使用mkstemp(3)
,或者对于唯一的打开文件描述符,我可以使用tmpfile(3)
。我应该如何得到一个唯一的POSIX消息队列?
我不想取名字;我所关心的是获得一个唯一的消息队列,就像我使用带有IPC_PRIVATE
的SYSV消息队列一样
对于POSIX消息队列,您确实必须指定一个名称,但您不必保留它,也不允许其他人以该名称使用相同的队列。
IPC_PRIVATE模仿
做mkstemp
和tmpfile
在引擎盖下做的事。借用任何"tmp"/"temp"名称选择算法来生成"/reasonably_unique",mq_open
it O_CREAT|O_EXCL,然后mq_unlink
it。然后,子工作进程可以继承消息队列描述符。
警告:root或您的EUID可能会弄清楚您在做什么,并在mq_open
和mq_unlink
之间跳转?是的。
或者,使用SOCK_DGRAM socketpair
或pipe
代替。它们提供了与POSIX消息队列类似的语义—attr.mq_msgsize
变成SO_SNDBUF/SO_RCVBUF,或者协议尊重PIPE_BUF, mq_notify
变成I/O可选性(可能已经是这样了)—虽然你失去了消息的优先级