2015-04-06 47 views
0

我的應用程序中有一個父進程和一個子進程。連接到子進程stdout的管道中的不完整消息

父母計劃每X毫秒查看管道,然後讀取管道(如果有任何內容)。內容基本上用在RPC中,這意味着父母並不僅僅是將消息傳遞給另一種類型的IPC。

這似乎工作,孩子生產輸出非常接近100毫秒的延遲,遠程程序被調用。

但是,有時似乎父進程會收到不完整的消息,就好像孩子正在與父母試圖讀取的同時一樣。這種情況每分鐘發生幾次。 這是預期的嗎?

我知道所有消息都以特定字符'}'結尾,我正在發送JSON。我應該在閱讀之前偷看並確保擁有這個角色。 (我還沒有這樣做,因爲這樣做會將父母的體系結構從啞信息網關更改爲具有「信息檢查」的父母體系結構)。

我正在使用Posix write()read(),如here。與O_NONBLOCK設置爲here

我已經使管道非阻塞,因爲我從孩子不斷地獲取數據,我不能阻止我的主應用程序。

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

+1

由於各種原因,讀取可能會縮短。讓客戶端在發送消息之前向父節點通知多少字節的消息將更加可靠,並且父節點首先讀取長度,然後讀取那麼多字節。 – jxh

+1

睡覺和偷看是毫無意義的。只要在閱讀電話中阻止。那麼你總是會阻止正確的時間。 – EJP

回答

2

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

這可以通過尋找消息結束的字符來進行(一個新行字符經常用於文本數據;一個EOT(0×04)或ETX(0×03)字符通常用於二進制數據)

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

+0

有沒有什麼方法可以在不破壞的情況下查看郵件,以便我可以檢查換行符。並閱讀是否發現換行符? –

+1

我很確定你不能,但即使可以,也可能會更好地在收聽者的緩衝區中重複累積「可用的任何內容」,並且只在收到整個信息時才處理消息(即,你已經收到了尾部的'}'[可能根據JSON的複雜性計算開啓/關閉花括號)。 – TripeHound