1
如果父進程有兩個子進程並且每個子進程都有自己的管道,父進程如何寫入每個子進程的管道?有什麼辦法可以調用一個進程可以指定特定孩子的ID的函數嗎?發送數據到子進程
如果父進程有兩個子進程並且每個子進程都有自己的管道,父進程如何寫入每個子進程的管道?有什麼辦法可以調用一個進程可以指定特定孩子的ID的函數嗎?發送數據到子進程
在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選擇相應的寫入結束。您可以使用簡單數組,排序數組,地圖或散列作爲查找表。
不需要。您必須自己將pid與fd-pair(管道)耦合。 (並且不要忘記每個進程都應該關閉所有不使用的管道文件描述符,否則你將遇到問題,在你需要它們的地方不會得到EOFs)。 – PSkocik
我完全明白你的觀點,但我仍然對將pid與fd-pair耦合感到困惑。你是怎樣做的?因爲我正在做的是我創建一個子進程,使用if-else語句檢查fork()的輸出,如果有父進程,我創建另一個子進程並重復相同的if-else語句。那麼如果它是父進程,我從服務器接收消息。 我想在這裏做的是,我想根據一些基本條件,將收到的父進程中的消息發送給子進程。 – zimmer