物联网
您现在所在的位置:首页>企业动态>物联网

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

编辑:学到牛牛IT培训    发布日期: 2024-02-02 09:26:53  

要循环创建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 ",i,getppid(),getpid());

        }   

        else if(pid > 0)

        {   

            printf("i = %d  ppid  = %d  pid = %d ",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 ",getpid(),getppid());

    }   

    else

    {   

        wait(NULL);

        printf("i = %d  pid = %d ppid = %d ",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 ",i,getpid(),getppid());

    }   

    else

    {   

        wait(NULL);

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

    }   


    return 0;

}

执行结果:

5.png

示例图如下:

6.png

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


免费试学
课程好不好,不如实地听一听

推荐阅读

  • 计算机专业的就业难度怎么样?

    国产午夜鲁丝片AV无码蜜臀,福利免费观看午夜体检区,人妻少妇精品无码专区APP,伊人久久大香线蕉成人综合网,国产妓女在线观看视频,亚洲成a人片在线观看尤物,亚洲精品国产一二三无码AV,亚汌国产一区二区三区

  • 嵌入式软件开发学习路线

    国产午夜鲁丝片AV无码蜜臀,福利免费观看午夜体检区,人妻少妇精品无码专区APP,伊人久久大香线蕉成人综合网,国产妓女在线观看视频,亚洲成a人片在线观看尤物,亚洲精品国产一二三无码AV,亚汌国产一区二区三区

  • 为什么自学编程那么难?

    国产午夜鲁丝片AV无码蜜臀,福利免费观看午夜体检区,人妻少妇精品无码专区APP,伊人久久大香线蕉成人综合网,国产妓女在线观看视频,亚洲成a人片在线观看尤物,亚洲精品国产一二三无码AV,亚汌国产一区二区三区

  • IT培训机构出来的到底好不好就业呢?

    国产午夜鲁丝片AV无码蜜臀,福利免费观看午夜体检区,人妻少妇精品无码专区APP,伊人久久大香线蕉成人综合网,国产妓女在线观看视频,亚洲成a人片在线观看尤物,亚洲精品国产一二三无码AV,亚汌国产一区二区三区

封闭学习

2

1

18180749853

蜀ICP备2021001672号

在线咨询 免费试听VIP课程