本文从一个Golang案例学习孤儿进程的主要内容
一、案例
main进程创建一个bash子进程,子进程存活10s退出,main进程睡20s退出
1 | package main |
启动一个子进程,os包自带StartProcess创建子进程 API
1 | func StartProcess(name string, argv []string, attr *ProcAttr) (*Process, error) { |
我们在linux环境下运行该代码
二、结果分析
从上面的打印看出:主进程PID:13642,子进程PID:13647;主进程30s退出,但此时子进程是存活状态(sleep),所以该子进程是孤儿进程状态,会由init进程(PID=1)来处理
同时我们查看进程的相关信息,打印进程的状态、父进程、子进程以及运行命令。分析如下:
1、主进程与子进程同时存活
查看子进程13647的状态,可以看代父进程是13642
1 | [centos@wunaichi ~]$ cd /proc/13647 |
2、主进程退出
30s后主进程退出,再查看子进程相关信息。子进程的父进程变成init进程(PID=1)
1 | [centos@xxxx 13647]$ cat status |
三、孤儿进程
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作,init 进程会循环地 wait() 它的已经退出的子进程。
孤儿进程结束后会被 init 进程善后,并没有危害。