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

时间:2014-08-27 20:53:58

标签: c++ c named-pipes blocking fifo

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

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 个答案:

答案 0 :(得分:3)

打开管道读/写而不是只读。当外部编写器关闭它时,这将阻止EOF。

或者,当收到EOF时,关闭管道并重新打开。