在以下代码中:
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?
答案 0 :(得分:5)
将文件描述符视为指向引用计数文件对象的指针。
当您fork
时,子进程会获得与父进程相同的相同流的新引用。父项和子项的描述符都指向同一个流对象。
当您的子进程exit
时,子进程的所有文件描述符都将关闭。但由于父对象也有流对象的文件描述符,因此流不会消失。
文件和流只有在没有人再引用它们时才被拆除。在这种情况下,父进程引用它们。
(为了更多的乐趣,请查看dup
系列函数,这些函数以类似的方式复制文件描述符。使用它,您可以在一个进程中为同一文件提供两个文件描述符。)