首页 > 解决方案 > 使用fork在c中创建n个子进程

问题描述

我在 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); 

} 

此代码从父进程创建 5 个进程并打印来自每个子进程的消息。我的问题是:由于我们没有对 c 使用任何限制,例如父进程和第一个子进程都执行的第二个 fork 不是吗?没有在父亲的代码中隔离 fork 这段代码如何不创建 2^5 个子进程?for 循环是否以某种方式阻止了这种情况的发生?

标签: coperating-system

解决方案


子进程不会调用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); 
    } 
} 

如果if块不包含exit,那么是的,每个孩子都会迭代回到循环的顶部,并可能fork再次迭代。但是由于每个子进程只在打印初始父进程调用后立即退出fork,所以您只创建 5 个进程。


推荐阅读