Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如果我在main中调用fork(),会发生什么?_C_Fork - Fatal编程技术网

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