Pipe
多個程序可以打開一個命名管道嗎?
我正在創建一個將通過命名管道發布數據的流程,並且我設想有多個訂閱者。每次新訂戶嘗試打開管道時,我的程序是否可以通過某種方式打開它正在擰的命名管道?
為清晰而編輯 我正在嘗試使用廣播模型。
- 如果有 1 個或 N 個訂閱者,我不會區分。
- 我很關心是否沒有訂閱者。如果沒有人在聽,我會關閉部分系統。
- 我不在乎處理數據。一旦有人訂閱,我希望他們獲得完整的數據集。
- 訂閱者不應獲得任何舊數據。一旦他們打開管道,他們應該會看到像流一樣的新數據。
首先,標題中的問題:
多個程序可以打開一個命名管道嗎?
答案是肯定的。我的意思是,不止一位讀者和不止一位作者同時出現。
現在你的實際問題:
每次新訂戶嘗試打開管道時,我的程序是否可以通過某種方式關閉它正在寫入的命名管道?
我不確定您所說的“開球”是什麼意思,但這是一個一般性的答案:
- 因為打開管道進行寫入是一個阻塞操作,直到其他人打開它進行讀取,並且因為寫入沒有讀取器的管道會觸發 SIGPIPE,所以您的寫入器(發布者)可以確定至少有一個讀取器(訂戶)。
另一方面,作者無法知道在給定時間是否有多個讀者(
inotify
不過,您可以通過監視 fifo 活動來緩解這種情況)
- 發布者將發送的消息不能針對特定的讀者。
- 發布者寫入的消息內容不會在讀者之間重複(即每個讀者都獲得作者發送的相同消息)。相反,每個讀者都會閱讀其中的一部分。例如,如果您將“HELLO WORLD”寫入具有三個訂閱者(讀者)的管道,那麼第一個可能會收到“HELL”,第二個可能會收到“LORD”,最後一個可能會收到“O W”
$$ edit $$現在你已經澄清了你的問題,我上面寫的仍然適用,我們可以得出一個結論:命名管道顯然不是滿足你需求的正確工具。您可能需要廣播/多播 UDP 套接字,或專用的消息傳遞系統,如D-Bus、AMQP代理等。