孤儿进程
我们经常听别人说到孤儿进程(Orphan Process),究竟是什么呢。
-
根据公开资料的解释,孤儿进程指的是在其父进程执行完成或被终止后仍继续运行的一类进程。
-
孤儿进程与僵尸进程是完全不同的,后面会详细介绍僵尸进程。而孤儿进程借用了现实中孤儿的概念,也就是父进程不在了,子进程还在运行,这时我们就把子进程的PPID设为1。前面讲PID提到,操作系统会创建进程号为1的init进程,它没有父进程也不会退出,可以收养系统的孤儿进程。
-
init
进程是Linux系统下的奇怪进程,这个进程是以普通用户权限运行但却具备超级权限的进程,简单地说,这个进程在Linux系统启动的时候做初始化工作,比如会根据/etc/inittab中设置的运行等级初始化系统等等,当然了,还有一个作用就是如上所说的:收养孤儿进程。 -
下面实现一个简单的孤儿进程,包含孤儿进程被init收养过程
<?php
$pid = pcntl_fork(); //fork 一个子进程
if($pid > 0){
//父进程运行逻辑
echo "父进程 PID:".posix_getpid().PHP_EOL;
// 睡眠5秒
sleep(5);
}else if($pid == 0){
//子进程运行逻辑
for($i=1; $i<=10; $i++){
//睡眠1秒
sleep(1);
// 获取当前进程父进程id
echo "PPID:".posix_getppid().PHP_EOL;
}
}else{
//fork 进程错误
echo "fork 进程错误".PHP_EOL;
}
5. 可以看到,前五秒内,子进程的父进程进程ID为7724,但是从第6秒开始,由于父进程已经提前退出了,子进程变成孤儿进程,所以init进程收养了子进程,所以子进程的父进程进程ID变成了1。
作用
在现实中用户可能刻意使进程成为孤儿进程,这样就可以让它与父进程会话脱钩,成为后面会介绍的守护进程。