2011-04-23 64 views
5

我正在研究一個簡單的並行應用程序,我希望使用單個進程來維護有關工作進程系列的狀態信息。建立一個POSIX消息隊列似乎比較容易,在這個隊列中,所有的工蜂都可以定期向狀態維護人員發送更新。我的問題? POSIX消息隊列必須有一個名稱。我不想選一個名字;我所關心的是獲得一個唯一的消息隊列,就像我使用SYSV消息隊列​​3210一樣。對於唯一的文件名我可以使用mkstemp(3)或者我可以使用tmpfile(3)的唯一打開文件描述符。 我應該如何獲得唯一的POSIX消息隊列?如何獲得唯一的POSIX消息隊列?

回答

3

我不想選一個名字;我所關心的是獲得一個唯一的消息隊列,就像我會使用SYSV消息隊列與IPC_PRIVATE

那麼,與POSIX消息隊列,您必須指定一個名字,但是你沒有以保留它,也不允許其他人按該名稱使用相同的隊列。

IPC_PRIVATE模仿

做什麼mkstemptmpfile引擎蓋下做的。借用任何「tmp」/「temp」名稱選擇算法來生成「/ reasonably_unique」,其中O_CREAT | O_EXCL爲mq_open,然後mq_unlink它。然後子工作進程可以繼承消息隊列描述符。

警告:根或你的EUID不見了,你知道你在做什麼,並跳到mq_openmq_unlink之間?是。

替代實施

或者,使用SOCK_DGRAM socketpairpipe代替。那些提供類似語義的POSIX消息隊列— attr.mq_msgsize變成SO_SNDBUF/SO_RCVBUF或者尊重PIPE_BUF的協議,mq_notify成爲I/O可選性(可能已經是這種情況)—儘管您確實會丟失消息優先級。

相關問題