C 在if/else块中跟踪具有多个fork的程序
我正在追踪这个程序。当我运行它时,我看到它输出了4次,但我不明白为什么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());
#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个打印。你能理解如何工作吗?杰克考虑自己写答案。