【发布时间】:2014-06-28 05:04:08
【问题描述】:
我有一个进程通过带有msgsnd 的消息队列发送数据。另一个使用msgrcv 从队列中读取的进程。读取过程需要等到它拥有所有消息才能继续。我如何告诉它所有消息都已发送?
我一直这样做的方式是在发件人发送完所有消息后,它会在一个while循环中检查队列中的消息数量。当没有更多消息时,它会关闭队列。
这告诉阅读过程继续做其他事情。不过,这似乎不太可靠。很多时候,发送进程会陷入检查队列状态的无限循环。
有没有办法让我只发送一条 EOF 消息并让阅读过程注意这一点?然后我可以发送 EOF 并退出发送进程。
【问题讨论】:
-
我很难确定您要解决的问题。为什么发送者在处理和完成消息时关心?没有什么可以阻止它关闭队列并在完成写入后退出。这些消息仍将存在给读者。这是消息队列的好处之一。
-
我以为关闭队列会阻塞它?或者至少给读者一个 msgcv 的值-1
-
一点也不。队列就像一个投递箱。您甚至不需要同时拥有读者和作家。队列是内核持久的,并且消息将一直保留,直到有东西读取它们、删除队列或重新启动操作系统。
-
啊,谢谢!我对它做了更多的阅读。这很有帮助。
标签: c unix message-queue sysv-ipc