在linux编程中我们或许需要创建多个进程才可以完成任务需求,那么我们怎么创建多个进程呢?下面我们介绍一下进程链与进程扇的概念
所谓进程链就是父进程创建一个子进程,创建的子进程再次创建出属于自己的子进程,这样依次往下循环,如下图所示。
所谓的进程扇就是一个父进程创建出多个子进程,如下图所示。
下面是进程链与进程扇的示例代码:
进程链
/*
* process_link.c
*
* Created on: 2016-11-22
* Author: river
*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int counter = 0;
if(argc < 2)
{
counter = 2;
}
else
{
counter = atoi(argv[1]);
}
int i = 1;
pid_t pid;
for(; i < counter; i++)
{
pid = fork();
if(pid < 0)
{
perror("fork error");
exit(1);
}
else if(pid > 0)
{
break;//父进程退出循环,子进程继续做循环
}
}
printf("pid: %d, ppid: %d\n", getpid(), getppid());
while(1)
{
sleep(1);
}
exit(0);
}
因为我们需要创建链式的进程结构,需要有这样的要求父进程创建了一个子进程后退出循环,防止再次创建子进程,子进程创建了一个进程后再退出。因此我们在for循环中需要判断父进程,如果是父进程则退出循环,保正父进程只会创建一个子进程。
我们在程序运行时输入参数4,该程序就会创建4个进程,程序运行结果如下:
pid: 5189, ppid: 5083
pid: 5190, ppid: 5189
pid: 5191, ppid: 5190
pid: 5192, ppid: 5191
上面的输出结果中5183是我们运行的程序的pid,5083是我们启动这个程序所使用的bash,其它三个进程是创建的进程链中的子进程。
我们通过pstree命令可以看到如下进程树:
├─gnome-terminal─┬─bash─┬─a.out───a.out───a.out───a.out
可以看到bash后面跟着4个链式的启动的进程。或者我们可以通过ps -ef | grep a.out 查看到后台运行的进程,如下所示:
river@Wind:~/workspace/linux_programming/process_create$ ps -ef | grep a.out
river 5189 5083 0 22:01 pts/3 00:00:00 ./a.out 4
river 5190 5189 0 22:01 pts/3 00:00:00 ./a.out 4
river 5191 5190 0 22:01 pts/3 00:00:00 ./a.out 4
river 5192 5191 0 22:01 pts/3 00:00:00 ./a.out 4
river 5224 5083 0 22:09 pts/3 00:00:00 grep --color=auto a.out
上面的进程链代码的关键是判断出是父进程则退出创建子进程的循环,子进程继续创建接下来的进程。而对于进程扇则是这样的,判断出子进程则退出创建子进程的循环,把创建进程的机会只留给父进程。代码如下:
/*
* process_swing.c
*
* Created on: 2016-11-22
* Author: river
*/
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int counter = 0;
if(argc < 2)
{
counter = 2;
}
else
{
counter = atoi(argv[1]);
}
int i = 1;
pid_t pid;
for(; i < counter; i++)
{
pid = fork();
if(pid < 0)
{
perror("fork error");
exit(1);
}
else if(pid == 0)
{
break;//子进程退出循环,父进程继续做循环
}
}
printf("pid: %d, ppid: %d\n", getpid(), getppid());
while(1)
{
sleep(1);
}
exit(0);
}
参数输入4,程序运行结果:
pid: 5308, ppid: 5083
pid: 5309, ppid: 5308
pid: 5310, ppid: 5308
pid: 5311, ppid: 5308
5083是启动的bash,父进程是5308,三个子进程是5309,5310,5311。