【问题标题】:How many read or write file descriptors will be there in total?总共有多少读或写文件描述符?
【发布时间】:2016-02-13 18:11:32
【问题描述】:
main() {
    int fd1[2],fd2[2];
    pipe(fd1);
    pipe(fd2);
    fork(); 
    fork();
}

上述代码中一共有多少个读或写文件描述符?总共将创建多少个管道?哪些数据将从各自的父进程复制到子进程?请解释程序的工作原理。

【问题讨论】:

    标签: c pipe fork ipc system-calls


    【解决方案1】:

    第一个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
    

    【讨论】:

    • 标准输入、标准输出和标准错误会在所有四个进程中都有吗?
    • 你可以看到上面 lsof 对一个进程的输出。由于两个孩子和孙子从父亲那里继承了文件描述符表,因此四个进程中的每一个都是相同的。当然,您在代码中看不到这一点,因为您的程序在第二次分叉后停止;只需在最后添加一个 sleep(60) 让他们活得更久。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-05
    • 2023-03-17
    • 2011-03-11
    • 1970-01-01
    • 2015-07-04
    相关资源
    最近更新 更多