main() {
int fd1[2],fd2[2];
pipe(fd1);
pipe(fd2);
fork();
fork();
}
上述代码中总共有多少个读写文件描述符?总共会创建多少个管道?什么所有数据将从其各自的父进程复制到子进程?请解释该计划的运作情况。
答案 0 :(得分:2)
第一个fork();
创造一个孩子;第二个fork();
由父亲和孩子经营,所以你得到一个孩子和一个孙子。所以总共有4个流程。
每个进程有7个已打开的FD:0,1,2加fd1[0,1]
加fd2[0,1]
)。因此有7次4 = 28次打开fds。
请注意,调用fork
而不检查错误/ child / father是一个非常糟糕的主意!
使用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