2014-08-27 64 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