我正在使用Posix消息队列在Suse Linux上编写客户端/服务器进程进行通信,类似于“How do I use mqueue in a c program on a Linux based system?”中接受的答案。当服务器终止时,它会执行 mq_close 和 mq_unlink 。但是,客户端不会收到此通知,因此即使队列已取消链接,客户端中对 mq_send 的调用也将继续有效。
问题是,当服务器重新启动时,它会尝试使用O_CREAT创建一个带有 mq_open 的队列,但由于客户端仍然有一个打开的fd,因此会失败。因此,即使/ dev / mqueue中的文件名似乎不存在,服务器也无法创建一个,直到客户端退出并关闭其文件描述符。我只是想确保我理解正确:如果我希望服务器关闭,取消链接并重新打开mqueue(例如:具有不同的属性),它是否肯定需要客户端退出或关闭它的fd?这与使用普通文件的方式有很大不同:我可以删除另一个进程正在使用的文件,文件系统可能会将其重命名为“.nfsXXX”,他们可以继续使用它,但我可以创建一个新文件立即使用该名称的文件。
我第一次尝试修复此问题只是为了在服务器退出时不取消链接mqueue - 如果我想允许重新启动服务器而不需要重新启动客户端,那么我想我不应该取消链接queue(因为服务器知道客户端可能仍在使用mqueue,因此不应该取消链接)。
我最理想的情况是新的 mq_open 在服务器中成功,而下一个 mq_send 在客户端失败。有一种简单的方法来模拟这个吗?我遇到的方式是: