使用fork在c中创建n子进程

问题描述 投票:0回答:2

我在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循环是否以某种方式阻止了这种情况的发生?

c operating-system
2个回答
5
投票

子进程不会调用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个进程。


2
投票

fork()在子进程中返回0,而在父进程中它返回子进程的PID。由于c在孩子中的值为0,if(c == 0)将评估为true,孩子将执行printf语句,然后退出。它永远不会达到循环评估声明。

© www.soinside.com 2019 - 2024. All rights reserved.