我的應用程序中有一個父進程和一個子進程。連接到子進程stdout的管道中的不完整消息
父母計劃每X毫秒查看管道,然後讀取管道(如果有任何內容)。內容基本上用在RPC中,這意味着父母並不僅僅是將消息傳遞給另一種類型的IPC。
這似乎工作,孩子生產輸出非常接近100毫秒的延遲,遠程程序被調用。
但是,有時似乎父進程會收到不完整的消息,就好像孩子正在與父母試圖讀取的同時一樣。這種情況每分鐘發生幾次。 這是預期的嗎?
我知道所有消息都以特定字符'}'結尾,我正在發送JSON。我應該在閱讀之前偷看並確保擁有這個角色。 (我還沒有這樣做,因爲這樣做會將父母的體系結構從啞信息網關更改爲具有「信息檢查」的父母體系結構)。
我正在使用Posix write()
和read()
,如here。與O_NONBLOCK
設置爲here。
我已經使管道非阻塞,因爲我從孩子不斷地獲取數據,我不能阻止我的主應用程序。
如果我需要實現對消息內容的檢查,我可能也會得到多個消息,並且可能會在同一個read()中實現處理多個消息,也許我可以拆分接收到的消息在'}'上並傳遞每條消息以進行處理。
由於各種原因,讀取可能會縮短。讓客戶端在發送消息之前向父節點通知多少字節的消息將更加可靠,並且父節點首先讀取長度,然後讀取那麼多字節。 – jxh
睡覺和偷看是毫無意義的。只要在閱讀電話中阻止。那麼你總是會阻止正確的時間。 – EJP