C 如果我在main中调用fork(),会发生什么?
简单的代码:C 如果我在main中调用fork(),会发生什么?,c,fork,C,Fork,简单的代码: #include <stdio.h> #include <string.h> main() { printf("Process"); fork(); fork(); return 0; } #包括 #包括 main() { printf(“过程”); fork(); fork(); 返回0; } 根据我对fork()的理解,执行此代码后,我们将有3个子进程和1个父进程。无论何时调用fork(),执行都应该从for
#include <stdio.h>
#include <string.h>
main()
{
printf("Process");
fork();
fork();
return 0;
}
#包括
#包括
main()
{
printf(“过程”);
fork();
fork();
返回0;
}
根据我对fork()的理解,执行此代码后,我们将有3个子进程和1个父进程。无论何时调用fork(),执行都应该从fork()语句之后的语句开始。因此,根据我的说法,“过程”应该只打印一次。但在我的输出过程中被打印了4次。这怎么可能呢?因为默认情况下标准输出是行缓冲的,所以当您调用
fork()
时,输出缓冲区由所有子进程继承
有几种不同的方法可以更改此行为:
在末尾添加新行字符:
printf("Process\n");
或者调用fflush()
刷新输出:
printf("Process");
fflush(stdout);
或使用以下命令将标准输出更改为非缓冲:
无论使用哪种方法,您都只能看到一次输出
注意:有关在代码中多次调用atexit()
的错误,请参阅。您的程序有错误。所有子进程都从main
返回,导致处理程序运行四次。孩子们应该调用\u 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;
}
#包括
#包括
#包括
main()
{
int是_child=0;
printf(“过程”);
如果(fork()==0)
is_child=1;
如果(fork()==0)
is_child=1;
如果(是孩子)
_出口(0);
返回0;
}
这实际上并不能修复该错误。它只是将代码从“有一个可怕的bug导致它做错误的事情”更改为“有一个可怕的bug碰巧没有造成任何伤害”。它解释了他的结果,但没有解释根本问题(atexit处理程序运行了四次),也没有告诉他如何解决根本问题。好吧……我不知道这一点。非常感谢。如果孩子需要打印一些东西到stdout,它…好的,我明白了。这种bug会造成什么样的负面影响?你能解释一下为什么重复调用这样的处理程序是件坏事吗?@user312567问你自己的问题。我很乐意解释如何正确地做到这一点。这需要家长的合作。在fork
之后和exec
之前,您可以做的事情是有限的,必须仔细安排,因为您与家长共享一些资源。如果可能,请扩展此答案。是的,看起来是这样。我应该删除这个还是听之任之?
#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;
}