2014-02-25 61 views
3

一段简单的代码:如果我在main中调用fork(),会发生什么?

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

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

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

+0

是看起来是这样的。我应该删除这个还是让它成为? – bigbong

回答

10

由于默认情况下标准输出为行缓冲,所以当您调用fork()时,输出缓冲区会被所有子进程继承。

有几种不同的方式来改变这种行为:

末添加新的行字符:

printf("Process\n"); 

或致电fflush()刷新输出:

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

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

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

无论使用哪种方式,您只会看到一次输出。

注意:请参阅@Dvaid Schwartz's answer以了解代码中多次调用atexit()的错误。

+4

这实际上并没有修复这个错误。它只是将代码从“有一个可怕的错误导致它做错了事”改为“有一个可怕的错误发生,不会因运气而受到伤害”。它解释了他的结果,但没有解决潜在的问题(atexit处理程序运行四次),也没有告诉他如何解决潜在的问题。 –

+0

好的..不知道这个。谢谢! – bigbong

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; 
} 
+0

如果孩子需要打印一些标准输出,它... – user3125367

+2

好吧,我明白了。这种错误会导致什么样的不利影响? – bigbong

+0

你能解释为什么反复调用这样的处理程序是件坏事吗? –

相关问题