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

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

2016-03-26 00:29 831 查看

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进程对它们完成状态收集工作。所以我们看到的结果就是上面的结果。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: