簡體   English   中英

連接到子進程的stdout的管道中的消息不完整

[英]Incomplete messages in pipe connected to stdout of child process

我的應用程序中有一個父進程和一個子進程。

計划將父進程每X毫秒窺視一次管道,然后讀取管道中是否包含任何內容。 內容基本上是在RPC中使用的,這意味着父級只不過是將消息傳遞給另一種IPC而已。

這似乎可行,子級產生的輸出延遲非常接近100ms,然后調用Remote過程。

但是,有時父進程似乎收到了不完整的消息,好像子進程與父進程試圖同時閱讀一樣。 每分鍾發生幾次。 這是預期的嗎?

我知道所有消息都以特定字符'}'結尾,我正在發送JSON。 在閱讀之前,我應該偷看並確保我有這個角色。 (我還沒有這樣做,因為這樣做會將父級的體系結構從一個啞消息網關轉變為帶有“消息檢查”的網關)。

我正在使用Posix write()read() ,就像這里 O_NONBLOCK設置像這里

我已經使管道成為非阻塞的,因為我不斷從孩子那里獲取數據,而我不能讓它阻塞我的主要應用程序。

如果需要對消息內容進行檢查,那么我也可能會收到多個消息,並在同一read()上對多個消息進行處理,也許我可以在'}'上拆分接收到的消息並傳遞每條消息進行處理。

管道是字符流,而不是消息流。 無法保證管道會保留您的消息邊界,因此讀者有責任重新組裝完整的消息。

這可以通過查找消息結尾字符來完成(文本數據通常使用換行符;二進制數據通常使用EOT(0x04)或ETX(0x03)字符。)

消息邊界也可以通過在每個消息之前發送包含計數的標頭來傳達。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM