2016-02-13 81 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),让它们活得更久一些。 –