您的位置:首页 > 运维架构 > Linux

linux进程系列(5)进程链与进程扇

2016-11-22 22:25 190 查看
    在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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: