Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/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 在if/else块中跟踪具有多个fork的程序_C_Fork_System_System Calls - Fatal编程技术网

C 在if/else块中跟踪具有多个fork的程序

C 在if/else块中跟踪具有多个fork的程序,c,fork,system,system-calls,C,Fork,System,System Calls,我正在追踪这个程序。当我运行它时,我看到它输出了4次,但我不明白为什么 #include <unistd.h> #include <stdio.h> #include <stdlib.h> int main() { if (fork() == 0) fork(); else { fork(); fork(); printf("%d\n", getpid());

我正在追踪这个程序。当我运行它时,我看到它输出了4次,但我不明白为什么

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main() 
{
    if (fork() == 0)
        fork();
    else 
    {
        fork();
        fork();
        printf("%d\n", getpid());
    }
}
据我所知,if/else分叉了我的程序,然后如果我们是孩子,它又分叉了。如果我们在父对象中,它将运行else块中的代码。但是,当我试图追踪这一点时,我感到困惑

一旦else语句再次分叉,我们不是在另一个孩子身上吗

孩子们什么时候停止产卵


在给我解释过之后,我现在明白了

第一个fork将生成一个子对象,我们称之为c1:

if (fork() == 0)
当您在子对象中时,fork的返回值为0。因此,c1将执行if语句块:

fork();
这里创建的子级c2和c1都将死亡,因为它们不会执行else块

fork();
同时,父进程将执行else块

fork();
这将创建原始父进程c3的另一个子进程。c3将执行else块中的下一个fork

fork();
现在,我们也要c4了

同时,原始父进程仍将有一个尚未运行的fork。这将创建最后一个子进程c5


在运行结束时,将有4个打印:原始父进程c3、c4和c5。

在为我解释之后,我现在明白了

第一个fork将生成一个子对象,我们称之为c1:

if (fork() == 0)
当您在子对象中时,fork的返回值为0。因此,c1将执行if语句块:

fork();
这里创建的子级c2和c1都将死亡,因为它们不会执行else块

fork();
同时,父进程将执行else块

fork();
这将创建原始父进程c3的另一个子进程。c3将执行else块中的下一个fork

fork();
现在,我们也要c4了

同时,原始父进程仍将有一个尚未运行的fork。这将创建最后一个子进程c5

在运行结束时,将有4个打印:原始父进程c3、c4和c5

如果执行了fork-in。现在有两个进程:子进程C1和父进程。父对象获取一个非零的数字。孩子得到0

父级在从fork获得非零返回时进入else块。在执行else块中的fork之后,现在又有两个进程child C2和parent

fork();
父母再次用C3叉

儿童C2再次与C4分叉

请注意,C1也有分叉,但除了结束if块外,它不会执行任何操作。我们不在乎这个

所以4,printf执行-一个由父级、C2、C3和C4执行

关键的一线黄金法则是:-

父进程和子进程都在系统调用fork之后立即开始执行

当控件到达函数的末尾时,每个进程都会结束,这里它是main。回答你的最后一个问题

如果执行了fork-in。现在有两个进程:子进程C1和父进程。父对象获取一个非零的数字。孩子得到0

父级在从fork获得非零返回时进入else块。在执行else块中的fork之后,现在又有两个进程child C2和parent

fork();
父母再次用C3叉

儿童C2再次与C4分叉

请注意,C1也有分叉,但除了结束if块外,它不会执行任何操作。我们不在乎这个

所以4,printf执行-一个由父级、C2、C3和C4执行

关键的一线黄金法则是:-

父进程和子进程都在系统调用fork之后立即开始执行


当控件到达函数的末尾时,每个进程都会结束,这里它是main。回答上一个问题。

在else块中,第一个fork复制进程,然后每个复制运行第二个fork,该fork再生成两个进程。最后有4个进程到达printf语句。else块仅由一个进程访问,即第一个fork的父进程,然后有两个fork调用。哦,好的!谢谢你们!我现在明白了。如果没有if部分,并且程序只包含else部分中的代码,您仍然会看到4个打印。“你能理解如何工作吗?”杰克考虑写自己的答案。然后在另一个块中,第一个叉重复这个过程,然后每个副本运行第二个叉,产生两个以上的进程。最后有4个进程到达printf语句。else块仅由一个进程访问,即第一个fork的父进程,然后有两个fork调用。哦,好的!谢谢你们!我现在明白了。如果没有if部分,并且程序只包含else部分中的代码,您仍然会看到4个打印。你能理解如何工作吗?杰克考虑自己写答案。