详细分析循环创建n个子进程
要循环创建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调用失败,打印错误消息并返回。
执行结果:
从以上结果来看, 创建了远远不止三个子进程。但是for(i=0;i<3;i++)只循环了三次,原因是因为创建完子进程后,子进程又会继续创建子进程,如下图所示(bash为终端):
为了解决子进程延伸的问题,对代码进行了修改,父进程负责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;
}
执行结果:
示例图如下:
除了上面的方式,还可以在父进程加上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;
}
执行结果:
示例图如下:
这种循环创建子进程的方式可以用于实现一些并行计算、并发任务处理等场景。但需要注意合理控制子进程的数量,避免过多的子进程导致系统资源耗尽。