Pipe

多個程序可以打開一個命名管道嗎?

  • March 11, 2021

我正在創建一個將通過命名管道發布數據的流程,並且我設想有多個訂閱者。每次新訂戶嘗試打開管道時,我的程序是否可以通過某種方式打開它正在擰的命名管道?

為清晰而編輯 我正在嘗試使用廣播模型。

  • 如果有 1 個或 N 個訂閱者,我不會區分。
  • 我很關心是否沒有訂閱者。如果沒有人在聽,我會關閉部分系統。
  • 我不在乎處理數據。一旦有人訂閱,我希望他們獲得完整的數據集。
  • 訂閱者不應獲得任何舊數據。一旦他們打開管道,他們應該會看到像流一樣的新數據。

首先,標題中的問題:

多個程序可以打開一個命名管道嗎?

答案是肯定的。我的意思是,不止一位讀者和不止一位作者同時出現。

現在你的實際問題:

每次新訂戶嘗試打開管道時,我的程序是否可以通過某種方式關閉它正在寫入的命名管道?

我不確定您所說的“開球”是什麼意思,但這是一個一般性的答案:

  • 因為打開管道進行寫入是一個阻塞操作,直到其他人打開它進行讀取,並且因為寫入沒有讀取器的管道會觸發 SIGPIPE,所以您的寫入器(發布者)可以確定至少有一個讀取器(訂戶)。

另一方面,作者無法知道在給定時間是否有多個讀者(inotify不過,您可以通過監視 fifo 活動來緩解這種情況)

  • 發布者將發送的消息不能針對特定的讀者。
  • 發布者寫入的消息內容不會在讀者之間重複(即每個讀者都獲得作者發送的相同消息)。相反,每個讀者都會閱讀其中的一部分。例如,如果您將“HELLO WORLD”寫入具有三個訂閱者(讀者)的管道,那麼第一個可能會收到“HELL”,第二個可能會收到“LORD”,最後一個可能會收到“O W”

$$ edit $$現在你已經澄清了你的問題,我上面寫的仍然適用,我們可以得出一個結論:命名管道顯然不是滿足你需求的正確工具。您可能需要廣播/多播 UDP 套接字,或專用的消息傳遞系統,如D-BusAMQP代理等。

引用自:https://unix.stackexchange.com/questions/638625