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

    在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。

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

洪流之源

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值