Linux的“孤儿进程”的“父进程”

  • 产生进程关系,观察进程间关系
  • 制造孤儿进程,观察其父进程

准备

- Linux环境
- 进程的创建的基本函数的使用(fork()等等)

1.产生进程关系,观察进程间关系


a.产生关系进程代码(process.c)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

int main(){
    int pid1, pid2, pid3, pid4, pid5;

    printf("1号进程开始\n");
    //得到第一个进程的pid
    pid1 = getpid();
    printf("PID1 = %d\n", pid1);

    //创建第二个进程
    pid2 = fork();
    if (pid2 == 0)
    {

        printf("2号进程开始\n");
        printf("PID 2= %d, Parent PID = %d\n", getpid(), getppid());
        printf("2号进程结束\n");

        //exit退出
        exit(0);
    }


        //创建第三个进程
        pid3 = fork();
        if (pid3 == 0)
        {
            printf("3号进程开始\n");
            printf("PID 3= %d, Parent PID = %d\n", getpid(), getppid());

        //在3号进程里面 创建第4个进程
        pid4 = fork();
        if (pid4 == 0)
        {
            printf("4号进程开始\n");
            printf("PID 4= %d, Parent PID = %d\n", getpid(), getppid());

            //sleep 3 second 
            //sleep(3);
            printf("4号进程结束\n");
            exit(0);
        }

            //在3号进程里面,创建第5个进程
        pid5 = fork();
        if (pid5 == 0)
        {

            printf("5号进程开始\n");
            printf("PID 5= %d, Parent PID = %d\n", getpid(), getppid());

            printf("5号进程结束\n");
            exit(0);
        }


        //等待子进程的结束  便于观察pid之间的关系
        sleep(3);
        printf("3号进程结束\n");
        exit(0);
    }


    //等待子线程的结束 
    sleep(5);
    printf("1号进程结束\n");
    return 0;
}


b. 编译运行

编译(注意这里用到了pthread库,所以编译的时候要加上-lpthread )

 $ gcc -o process.out process.c -lpthread 


c.运行
 $ ./process.out


d.运行结果
  • 这里写图片描述

e.分析结果
  • 这里写图片描述



2. 制造孤儿进程,观察其父进程


a.制造孤儿进程代码(processes.c)
// 主函数
int main(){

    int pid1, pid2, pid3, pid4, pid5;

    printf("1号进程开始\n");
    //得到第一个进程的pid
    pid1 = getpid();
    printf("PID1 = %d\n", pid1);

    //创建第二个进程
    pid2 = fork();
    if (pid2 == 0)
    {

        printf("2号进程开始\n");
        printf("PID2 = %d, Parent PID = %d\n", getpid(), getppid());
        printf("2号进程结束\n");

        //exit退出
        exit(0);
    }

    //创建第三个进程
    pid3 = fork();
    if (pid3 == 0)
    {
        printf("3号进程开始\n");
        printf("PID 3= %d, Parent PID = %d\n", getpid(), getppid());

        //在3号进程里面 创建第4个进程
        pid4 = fork();
        if (pid4 == 0)
        {
            printf("4号进程开始\n");
            printf("PID 4= %d, Parent PID = %d\n", getpid(), getppid());

            //sleep 3 second  等待3号进程结束,自己变成孤儿进程
            sleep(3);
            printf("4号进程结束\n");
            exit(0);
        }

        //在3号进程里面,创建第5个进程
        pid5 = fork();
        if (pid5 == 0)
        {
            printf("PID 5= %d, Parent PID = %d\n", getpid(), getppid());
            printf("5号进程开始\n");

            //sleep 3 second  等待3号进程结束,自己变成孤儿进程
            sleep(3);
            printf("5号进程结束\n");
            exit(0);
        }
        //等待子进程的结束  便于观察pid之间的关系
        printf("3号进程结束\n");                
        exit(0);
    }


    //等待子线程的结束 
    printf("1号进程结束\n");
    return 0;
}


b.编译
$ gcc -o process.out processes.c -lpthread


c.运行
$ ./process.out


d.运行结果
  • 这里写图片描述


d.运行结果分析
   其实进程间关系还是和上面程序一样的(进程1创建了进程2和进程3两个进程,然后进程3又创建了进程4和进程5),但是区别在与,进程4和进程5创建出来后,由于sleep的作用,寿命比其父进程(进程3)长,所以当进程3结束之后,进程4和进程5就变成了孤儿进程;
   在Linux系统中,孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。所以我们看到的结果就是上面的结果。
Logo

更多推荐