2016-11-12 56 views
1

如果父進程有兩個子進程並且每個子進程都有自己的管道,父進程如何寫入每個子進程的管道?有什麼辦法可以調用一個進程可以指定特定孩子的ID的函數嗎?發送數據到子進程

+0

不需要。您必須自己將pid與fd-pair(管道)耦合。 (並且不要忘記每個進程都應該關閉所有不使用的管道文件描述符,否則你將遇到問題,在你需要它們的地方不會得到EOFs)。 – PSkocik

+0

我完全明白你的觀點,但我仍然對將pid與fd-pair耦合感到困惑。你是怎樣做的?因爲我正在做的是我創建一個子進程,使用if-else語句檢查fork()的輸出,如果有父進程,我創建另一個子進程並重復相同的if-else語句。那麼如果它是父進程,我從服務器接收消息。 我想在這裏做的是,我想根據一些基本條件,將收到的父進程中的消息發送給子進程。 – zimmer

回答

0

在fork之前,創建一個管道(fd對)。

int pipe_fds[2]; 
if(0>pipe(pipe_fds[2])) /*handle err.*/; 

fork,再有父進程關閉讀端和管道的寫端保存到pid_to_pipe表:

if(0>(pid = fork())) /*handle err.*/; 

if(pid){ //parent 
    if(0>save_pid_to_pipe(pid, pipe_fds[1])) /*handle err.*/; 
    close(pipe_fds[0]); 
} 

孩子需要關閉的最新寫端管:

close(pipe_fds[0]); 

全部寫在父母的查找表結束。 然後,它可以等待pipe_fds[0];(讀取結束是在創建子時創建的最後一個讀取結束)的指令,而父級可以通過查找表通過pid選擇相應的寫入結束。您可以使用簡單數組,排序數組,地圖或散列作爲查找表。