2011-10-23 47 views
1

如果我有,我想管4個過程:我是否必須爲C中的每對進程創建一個新管道?

process1 | process2 | process3 | process4 

做我必須做3米個人的管道喜歡這個

int pipe1[2]; 
int pipe2[2]; 
int pipe3[2]; 

或可我莫名其妙地回收管道的名字,像在這個僞代碼:

int pipe1[2];    // we use ONLY two pipe names: pipe1 
int pipe2[2];    //       and pipe2 

pipe(pipe1);    // getting 2 file descriptors here 
pipe(pipe2);    // and 2 here 

for process=1 to 4 
    if (process==3)   // getting 2 new file descriptors for 
    pipe(pipe1);   // process3|process4 (reusing pipe1) 

    fork()     // forking here 
    if (child 1) then 
    use pipe1 
    if (child 2) then 
    use pipe1 
    use pipe2 
    if (child 3) then 
    use pipe2 
    use pipe1    //the pipe1 that we re-pipe()ed 
    if (child 3) then 
    use pipe1    //the pipe1 that we re-pipe()ed 

這項工作?我不知道repipe1 pipe1是否會對使用pipe1的以前的分叉進程產生影響。

回答

1

我過去做過的方式,以及我再次做到這一點的方式,是不重複使用管道,最終使用N-1管道。這也取決於你是否希望有兩個以上的進程在同一時間進行通信,如果是這樣的話,你顯然會在重用2個管道時遇到問題。

0

對於命令中的每個|字符,您需要一個管道,因此需要一個管道調用pipe()

儘管如此,您不需要使用三個單獨的int [2]數組來存儲管道文件描述符。系統不關心你存儲管道文件描述符的變量 - 它們只是int s。

1

簡短的回答: 沒有,「repiping」 PIPE1不會對所使用PIPE1以前派生的進程產生影響,但你最好還是宣佈3個管材,管()'荷蘭國際集團前叉() ING。

龍答: 要了解原因,讓我們先來看看當你創建一個「管道」會發生什麼,然後什麼,當你「叉」的過程發生。

當調用管(),它 「創建一個管道(一個對象,允許單向 數據流),並分配一對文件描述符的第一描述符連接至管道的讀端;所述第二所連接到寫作結束。「 (這是來自man pipe頁面)

這些文件描述符存儲在您傳入的int數組中。

當你調用fork(),「新進程(子進程)應調用進程的精確副本」(這是從人fork()的頁)

換句話說,父進程將創建一個子進程,並且該子進程將擁有它的自己的數據副本。

所以,當孩子3個電話管(PIPE1),這將創建一個新的管道,並保存新的文件描述符在它的自己的PIPE1變量的副本,而無需修改任何其他進程的PIPE1。

即使你只能聲明兩個管道變量而只是在子節點3中調用pipe(),它並不是很容易閱讀,而其他人(包括你自己)在稍後必須查看你的代碼。

有關fork()和pipe()的更多信息,請參閱http://beej.us/guide/bgipc/output/html/multipage/index.html

相關問題