我有一个正在运行的进程,它基本上用作缓存并通过命名管道与其他进程通信。这些其他进程可以定期向缓存进程发送消息。现在原则上在缓存过程中对我有用的是:
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
。
为什么我需要这个?
缓存进程应该是守护进程,并且只要用户调用相应的二进制文件,其他进程就应该与此守护进程通信。
答案 0 :(得分:3)
打开管道读/写而不是只读。当外部编写器关闭它时,这将阻止EOF。
或者,当收到EOF时,关闭管道并重新打开。