2014-09-23 45 views
1

我有一個代碼創建兩個管道,用於寫入和讀取調用另一個程序的2(至4)個子進程的數據。這個程序的代碼只是兩個printf,一個打印-和另一個打印Done都連接到stdout連接到父進程的讀取管道。 在父過程中,我閱讀使用從子進程逐個讀取數據

read(pipes[i][1][0], buffer, sizeof(buffer)-1); 

數據的問題是,如果我設置的buffer大小爲4(比如說)read()調用讀取-Do這不是我想要的,因爲我會之後再次致電read()。 如果大小爲2,則一切正常,因爲我知道要讀取的內容的大小,但在其他代碼中,我沒有這些信息。

我試過fflush(stdout)關於子進程每個printf()但它不起作用。我認爲這很容易解決,但我無法弄清楚,有沒有辦法逐一閱讀由子進程生成的相片?

回答

1

一種理智的方式可能是使用換行符'\n'作爲分隔符。

將緩衝區大小設置爲您的確切消息大小是一種非常脆弱的黑客攻擊,因爲只要您添加具有不同長度的新消息,它就會中斷。

一般來說,您希望通過面向流的連接(管道,流或TCP套接字)發送的任何內容都需要帶有長度的消息頭或分隔符,以便於解析。


如果你拼命想要把每個寫爲離散消息,你可以選擇使用數據報套接字,這實際上表現是這樣的。在這種情況下,你會尋找一個AF_UNIX/SOCK_DGRAM socketpair。

+0

通過使用換行符,你的意思是我必須通過字符來讀取char,並在發現''\ n''時停止? – 2014-09-23 11:27:59

+0

那麼,你可以使用'fgets'或類似的東西。 – Useless 2014-09-23 12:03:54

+0

好的,我會使用該解決方案。謝謝。 – 2014-09-23 12:25:13

0

您可以將緩衝區的大小設置爲5,並在執行第一次讀取()時讀取「 - 」。通過以下操作只能讀取1個字符:

read(pipes[i][1][0], buffer, 2); 

然後當您執行第二次讀取時。通過做閱讀4個字符:

read(pipes[i][1][0], buffer, 4); 

緩衝區的大小設置爲5含有到底\ 0字符,如果你想要做的字符串操作來檢查你所讀的。

+0

這解決了我給出的示例消息的問題,但在代碼的其餘部分中,我不知道要讀取的內容的大小,則無法這樣做。 – 2014-09-23 11:28:34

+0

但是,如果您不知道要讀取的內容的大小,則必須通過執行多次讀取來完成。 例如,如果您正在從其他進程讀取一組命令/數據包。另一個進程可以給出具有恆定長度的分組的標識符。你可以閱讀,然後根據你將要做的下一次閱讀的大小來決定。 或者在其他情況下,如果您知道您將收到的東西的順序,那麼您可以按照相應的讀取大小以特定順序閱讀它們。 – Sami 2014-09-23 15:57:05