欢迎来到军工软件开发人才培养基地——学到牛牛

详细分析循环创建n个子进程

时间:2024-05-06 07:01:10 来源:学到牛牛

要循环创建n个子进程,可以使用循环结构(如for或while)和fork函数的组合。下面是一种常见的方式:

例一:

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

#include <stdio.h>

int main()

{

    int n = 3;

    int i;

    pid_t pid;

    for(i=0;i<n;i++)

    {   

        pid = fork();

        if(pid == 0)

        {   

            printf("i = %d  ppid =  %d  pid = %d\n",i,getppid(),getpid());

        }   

        else if(pid > 0)

        {   

            printf("i = %d  ppid  = %d  pid = %d\n",i,getppid(),getpid());

        }   

        else

        {   

            perror("fork error;");

            exit(1);

        }   

    }   

    sleep(1);

    return 0;

}

在上面的代码中,首先定义了要创建的子进程数量n为3。然后使用for循环来创建n个子进程。在每次循环中,调用fork函数创建一个子进程,并根据返回值判断当前进程是父进程还是子进程。如果fork返回0,则表示当前进程是子进程。子进程打印出自己的编号和进程ID。

如果fork返回正数(子进程的进程ID),则表示当前进程是父进程。父进程继续循环创建下一个子进程。

如果fork返回负数,则表示fork调用失败,打印错误消息并返回。

执行结果:

1.png

从以上结果来看, 创建了远远不止三个子进程。但是for(i=0;i<3;i++)只循环了三次,原因是因为创建完子进程后,子进程又会继续创建子进程,如下图所示(bash为终端):

2.png

为了解决子进程延伸的问题,对代码进行了修改,父进程负责fork(),子进程什么都不做。子进程里使用break跳出循环,只让父进程创建子进程,不让子进程里再创建子进程,这样的话,循环n次,创建n个子进程。

例二:

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

#include <stdio.h>

 

int main()

{

int n = 3;

    int i;

    pid_t pid;

    for(i=0;i<n;i++)

    {   

        pid = fork();

        if(pid == 0)

        {

            break;

        }

    }   

    if(i < n)

    {   

      printf("i = %d  pid =  %d ppid =  %d\n",getpid(),getppid());

    }   

    else

    {   

        wait(NULL);

        printf("i = %d  pid = %d ppid = %d\n",getpid(),getppid());

    }   

 

    return 0;

}

执行结果:

3.png

示例图如下:

4.png

除了上面的方式,还可以在父进程加上break,让代码循环3次,父进程创建一个子进程,子进程又创建一个子进程,以此类推,最终也可以实现创建3个子进程的效果。

例三:

#include <unistd.h>

#include <stdlib.h>

#include <string.h>

#include <stdio.h>

 

int main()

{

    int n = 3;

    int i;

    pid_t pid;

    for(i=0;i<n;i++)

    {   

        pid = fork();

        if(pid > 0)

        {

            break;

        }

    }   

    if(i < n)

    {   

         printf("i = %d pid =  %d ppid =  %d\n",i,getpid(),getppid());

    }   

    else

    {   

        wait(NULL);

        printf("i = %d pid =  %d ppid =  %d\n",i,getpid(),getppid());   

    }   

 

    return 0;

}

执行结果:

5.png

示例图如下:

6.png

这种循环创建子进程的方式可以用于实现一些并行计算、并发任务处理等场景。但需要注意合理控制子进程的数量,避免过多的子进程导致系统资源耗尽。