2016-02-13 46 views
1
main() { 
    int fd1[2],fd2[2]; 
    pipe(fd1); 
    pipe(fd2); 
    fork(); 
    fork(); 
} 

上面代碼中共有多少個讀或寫文件描述符?總共將創建多少個管道?所有數據將從其各自的父進程複製到子進程?請解釋程序的工作。總共有多少個讀或寫文件描述符?

回答

2

第一個fork();創建一個孩子;第二個fork();由父親和孩子經營,所以你得到一個第二個孩子和一個孫子。所以你會得到4個進程。

每個過程有7個打開的FD:0,1,2加fd1[0,1]fd2[0,1])。因此有7次4 = 28打開的fds。

請注意,調用fork而不檢查錯誤/孩子/父親是一個非常糟糕的主意!

請參閱使用lsof -p <pid> 4個正在運行的進程之一的輸出:

a.out 13147 thiel 0u CHR 136,1  0t0  4 /dev/pts/1 
a.out 13147 thiel 1u CHR 136,1  0t0  4 /dev/pts/1 
a.out 13147 thiel 2u CHR 136,1  0t0  4 /dev/pts/1 
a.out 13147 thiel 3r FIFO 0,8  0t0 1143532 pipe 
a.out 13147 thiel 4w FIFO 0,8  0t0 1143532 pipe 
a.out 13147 thiel 5r FIFO 0,8  0t0 1143533 pipe 
a.out 13147 thiel 6w FIFO 0,8  0t0 1143533 pipe 
+0

請問標準輸入,輸出和錯誤是沒有在所有的四個過程? – h8pathak

+0

您可以在一個進程中看到上面的lsof的輸出。自從兩個孩子和孫子女從父親那裏繼承文件描述符表以來,四個進程中的每一個都是相同的。當然,你不能在你的代碼中看到這個,因爲你的程序在第二個分支之後停止;只需在最後添加一次睡眠(60),讓它們活得更久一些。 –