pei*_*ean 1 c operating-system
我在geeks4geeks中找到了此代码,但我似乎无法正确理解它:
#include<stdio.h>
int main()
{
for(int i=0;i<5;i++) // loop will run n times (n=5)
{ pid_t c=fork();
if(c == 0)
{
printf("[son] pid %d from [parent] pid %d\n",getpid(),getppid());
exit(0);
}
}
for(int i=0;i<5;i++) // loop will run n times (n=5)
wait(NULL);
}
Run Code Online (Sandbox Code Playgroud)
这段代码从父进程创建5个进程并从每个子进程打印一条消息。我的问题是:由于我们没有对c使用任何限制,例如不是父进程和第一个子进程都执行了第二个fork?在父亲代码中隔离fork,此代码如何不创建2 ^ 5个子进程?for循环是否以某种方式阻止了这种情况的发生?
子进程不会调用,fork因为它们在此之前退出:
for(int i=0;i<5;i++)
{
pid_t c=fork();
if(c == 0) // fork returns 0 to the child process so it enters "if" block
{
printf("[son] pid %d from [parent] pid %d\n",getpid(),getppid());
// child exits
exit(0);
}
}
Run Code Online (Sandbox Code Playgroud)
如果该if块不包含该块,exit则每个孩子都会迭代回到循环的顶部,并可能fork再次迭代。但是,由于每个子项仅在打印初始父进程调用之后退出fork,因此您只能创建5个进程。