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进程对它们完成状态收集工作。所以我们看到的结果就是上面的结果。
相关文章推荐
- Linux下的C之2048
- 树莓派忘记密码
- 更改linux主机名称
- linux安装jdk
- CentOS安装Node.js
- 在ubunt14.04(linux)下利用cmake编译运行opencv程序
- CentOS源码安装MySQL教程
- Linux内核分析第五周学习总结——分析system_call中断处理过程
- 《LINUX3.0内核源代码分析》第二章:中断和异常 【转】
- linux下mysql查询时中文乱码(终极解决办法)亲测!
- linux中断系统那些事之----中断处理过程【转】
- linux,ubuntu下软件的更新命令
- Linux下给树莓派安装及配置系统
- Linux USB 驱动开发实例(一) —— USB摄像头驱动实现源码分析
- Linux下的目录结构
- SecureCRT连不上Linux虚拟机的一种可能
- Centos7.1防火墙开放端口
- Linux中mv重命名作用及打包war压缩文件及分配权限
- linux :make: gcc: Command not found
- 编译linux内核遇到的问题