2012-04-13 114 views
4

幾乎所有pipe示例我看到關閉未使用的寫入/讀取結束的建議。也有人明確指出,pipe() creates a pipe, a unidirectional data channel但我已經嘗試讀和寫在父母和孩子的管道兩端,一切似乎都沒問題。爲什麼使用pipe()創建的管道不能用作雙向管道?

所以我的疑問是,爲什麼我們需要2管道,如果兩個進程必須讀取和寫入對方,爲什麼不使用單個管道呢?

+1

因爲首先實現pipe()的人使它成爲單向的,這成爲後續實現的標準。 (請注意,在某些操作系統的管道()上會給你一個雙向流,而另一些則不會)。如果需要雙向通信,只需使用2個管道或使用socketpair()。 – nos 2012-04-13 13:35:26

+0

首先實現管道()的傢伙只配備了一個緩衝管道,類似於流體/氣體輸送的真實管道。對於雙緩衝區,請參閱套接字。 – 2012-04-13 13:50:56

+0

Solaris管道是雙向的。並不是很多人都在使用Solaris,只是把它扔到那裏。但是,正如其他人已經明確表示的那樣,如果你想要可移植性,你就不應該假設這種能力。 – FatalError 2012-04-13 13:53:46

回答

8

如果使用相同的管道如何孩子從父母信息中分離出來的消息,反之亦然寫?

例如:

Parent writes to pipe 
Parent reads from pipe hoping to get message from child but gets its own message :(

這是很容易使用的兒童安全>家長一個管和父 - >兒童的另一個管道。

即使您有一些讀/寫協議,也很容易使父進程和子進程死鎖。

+0

這個質量保證應該是在介紹什麼管道時的背景...... – n611x007 2013-09-16 10:22:23

5

可以讀和寫在所創建的管的兩端,但單向意味着只有數據隨時在一個方向上行進,從父到子,或反之亦然。需要兩個管道來實現非阻塞的數據發送和接收,這意味着您可以同時讀取和寫入兩個管道,但是隻有一個管道必須先完成讀取,然後才能寫入管道,或者您必須完成一些寫操作然後才能閱讀管道。 在通俗地說,你只能讀取或在任何時間點只有一個管

+0

謝謝!這裏是新的,不確定格式 – 2012-04-13 13:51:45