我相信这会创建 24 个进程;但是,我需要验证。这些问题常常难倒我。谢谢您的帮助!
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
pid_t pid = fork();
pid = fork();
pid = fork();
if (pid == 0)
{
fork();
}
fork();
return 0;
}
我相信这会创建 24 个进程;但是,我需要验证。这些问题常常难倒我。谢谢您的帮助!
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(void)
{
pid_t pid = fork();
pid = fork();
pid = fork();
if (pid == 0)
{
fork();
}
fork();
return 0;
}
这很容易推理。该fork
调用每次执行时都会创建一个额外的进程。该调用0
在新的(子)进程中返回,并且在原始(父)进程中的子进程(非零)的进程ID。
pid_t pid = fork(); // fork #1
pid = fork(); // fork #2
pid = fork(); // fork #3
if (pid == 0)
{
fork(); // fork #4
}
fork(); // fork #5
pid==0
一半有pid != 0
这样计算:
从 1(Main Process) 开始,如果 fork 不在 if(pid == 0) 内部,则每个 fork 进行两次,否则将当前进程的 1/2 添加到当前进程数。
在您的代码中: 1P Got #1 fork() 因此将当前进程数加倍。现在新进程数2P
得到#2 fork() 使当前进程数加倍。现在新进程数 4P
得到了#3 fork(),所以将当前进程数加倍。现在新进程数8P
得到了 #4 fork() 但等待它处于 if 条件所以 (8+4 = 12)P
得到#5 fork() 所以将当前进程数加倍。现在新进程数 24P
你是对的。它是 24。刚刚编译并在最后的 return 语句之前使用 printf 运行它。有 24 行输出。
该语句有 24+ 子进程。每次调用 fork() 都会产生两个进程,即子进程和父进程。因此,第一次分叉导致两个进程。这两个进程到达第二个 fork(),产生四个进程。最后的 fork() 由这四个到达,从而增加了八个进程。除了这些进程中的一个(原始进程)之外,所有进程都是至少一个分叉的子进程。