Linux的“孤儿进程”的“父进程”
Linux的“孤儿进程”的“父进程”产生进程关系,观察进程间关系制造孤儿进程,观察其父进程准备- Linux环境- 进程的创建的基本函数的使用(fork()等等)1.产生进程关系,观察进程间关系 a.产生关系进程代码(process.c)#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <pthread.
·
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进程对它们完成状态收集工作。所以我们看到的结果就是上面的结果。
更多推荐
已为社区贡献1条内容
所有评论(0)