写入已关闭的文件描述符不会引发错误

时间:2016-12-24 21:46:03

标签: c

在以下代码中:

int main(void) {
        printf("before child\n");

        int pid = fork();

        if(pid == 0)
        {
                exit(0);
        }
        int status;
        wait(&status);
        if(4 != printf("abc\n"))
                perror("printing to stdout\n");
        return 0;
}

产生输出:

before child
abc

对子进程中的exit()的调用应该关闭所有文件描述符,包括stdout fd。 那么父进程在关闭之后如何仍然写入stdout?

1 个答案:

答案 0 :(得分:5)

将文件描述符视为指向引用计数文件对象的指针。

当您fork时,子进程会获得与父进程相同的相同流的新引用。父项和子项的描述符都指向同一个流对象。

当您的子进程exit时,子进程的所有文件描述符都将关闭。但由于父对象也有流对象的文件描述符,因此流不会消失。

文件和流只有在没有人再引用它们时才被拆除。在这种情况下,父进程引用它们。

(为了更多的乐趣,请查看dup系列函数,这些函数以类似的方式复制文件描述符。使用它,您可以在一个进程中为同一文件提供两个文件描述符。)