命名管道:如何阻塞直到关闭的写入端重新打开?

3

我有一个运行的进程,基本上作为缓存,并通过命名管道与其他进程通信。这些其他进程可能会定期向缓存进程发送消息。现在原则上对于我在缓存进程中能够起作用的是:

while(true) {
    int read_status = read(fifo_fd, buffer, BUFFER_SIZE);
    if (read_status > 0) {
        //at least a byte was read -> do something with the message
    }
}

但这显然会影响性能,因为read()EOF时立即返回,在管道中没有可读内容时会导致繁忙等待循环。(编辑)我之所以接收到EOF,是因为写入进程可能多次执行以下循环:open()write()close() 如果管道中除了EOF没有其他字符,我希望整个循环都是阻塞的。我还调查了select()poll(),它们对于EOF也不是阻塞的。
为什么我需要这个?
缓存过程应该是一个守护进程,其他进程应该在用户调用相应二进制文件时与该守护进程通信。

1
嗯?两端打开的命名管道并不处于EOF状态。 - Charles Duffy
1
啊!这更有点意义,是的。一个选项是打开 RW -- 那么它永远不是 EOF -- 另一个是使用特定于平台的 API,如 inotify,在其他人打开管道时收到通知。 - Charles Duffy
他的回答不知怎么消失了... - ben
你为什么要一开始就这样做呢? - Stas Jaro
如果允许的话,我建议OP尝试使用socket,然后再使用epoll,如果程序是那种性质的。 - Jason Hu
显示剩余11条评论
1个回答

4
打开您的管道进行读写而不是只读。这将防止在外部写入程序关闭它时出现EOF。
或者,当收到EOF时,关闭管道并重新打开它。

我只是在想:假设我选择第二个解决方案-那么在close()和open()之间是否存在一个小的时间框架,在这段时间内传入的消息将被丢弃? - ben
不要在close()和open()之间进行任何操作,因为任何新的写入操作都会被阻塞。 - Charles Duffy
好的。非常感谢 - 我在这个问题线程中学到了很多东西! - ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接