【发布时间】:2016-02-13 18:11:32
【问题描述】:
main() {
int fd1[2],fd2[2];
pipe(fd1);
pipe(fd2);
fork();
fork();
}
上述代码中一共有多少个读或写文件描述符?总共将创建多少个管道?哪些数据将从各自的父进程复制到子进程?请解释程序的工作原理。
【问题讨论】:
标签: c pipe fork ipc system-calls
main() {
int fd1[2],fd2[2];
pipe(fd1);
pipe(fd2);
fork();
fork();
}
上述代码中一共有多少个读或写文件描述符?总共将创建多少个管道?哪些数据将从各自的父进程复制到子进程?请解释程序的工作原理。
【问题讨论】:
标签: c pipe fork ipc system-calls
第一个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
【讨论】: