2014-08-27 85 views
2

我有一个进程正在运行,它基本上用作缓存并通过命名管道与其他进程通信。定期这些其他进程可能会将消息发送到高速缓存进程。现在原则的会是什么缓存处理工作对我来说是这样的:命名管道:如何封闭,直到封闭写入面重新打开?

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

Eh?在两端打开的命名管道*不在EOF处。 – 2014-08-27 20:55:55

+0

就像这样:一个进程可能打开管道,写入管道,关闭它并在任何时间点重复这个循环。 EOF现在有意义吗? (我不熟悉这个领域) – ben 2014-08-27 20:57:53

+1

啊!这更有意义,是的。一种选择是打开RW--然后它不会是EOF - 另一种选择是使用特定于平台的API,例如inotify在其他人打开管道时收到通知。 – 2014-08-27 20:59:48

回答

3

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

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

+0

我只是想知道:假设我选择第二个解决方案 - 是不是在close()和open()之间有一个很小的时间间隔,在此期间传入的消息将被丢弃? – ben 2014-08-27 21:20:37

+0

不在'close()'和'open()'之间,因为任何新的作家都会阻止。 – 2014-08-27 21:21:56

+0

好的。非常感谢 - 我在这个问题上学到了很多东西 - 线程! – ben 2014-08-27 21:22:37