如果我在main中调用fork()会发生什么?

时间:2014-02-25 08:29:46

标签: c fork

简单的代码:

#include <stdio.h>
#include <string.h>

main()
{
     printf("Process");
     fork();
     fork();
     return 0;
}

根据我对fork()的理解,在执行此代码之后,我们将有3个子进程和1个父进程。每当我们调用fork()时,执行应该从fork()语句之后的语句开始。因此根据我“过程”应该只打印一次。但在我的输出过程正在打印4次。怎么可能?

2 个答案:

答案 0 :(得分:10)

由于默认情况下标准输出是行缓冲的,因此当您调用fork()时,输出缓冲区将由所有子进程继承。

有几种不同的方法可以改变这种行为:

在最后添加一个新的行字符:

printf("Process\n");

或致电fflush()以清除输出:

printf("Process");
fflush(stdout);

或使用setbuf() or setvbuf()将标准输出更改为不缓冲:

setbuf(stdout, NULL);
printf("Process");

使用任何一种方法,您只会看到输出一次。

注意:有关在代码中多次调用atexit()的错误,请参阅@Dvaid Schwartz's answer

答案 1 :(得分:4)

您的程序有错误。 所有子项从main返回,导致atexit个处理程序运行四次。孩子们应该致电_exit

以下是您的代码的外观:

#include <stdio.h> 
#include <string.h>
#include <unistd.h>

main()
{
     int is_child = 0; 
     printf("Process");

     if (fork() == 0) 
        is_child = 1; 

     if (fork() == 0) 
        is_child = 1;

     if (is_child)
        _exit(0);

     return 0;
}