PHP孤儿进程

Posted wgchen~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP孤儿进程相关的知识,希望对你有一定的参考价值。

场景

孤儿进程指的是在其父进程执行完成或被终止后仍继续运行的一类进程。这些孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

孤儿进程没有任何危害,只是需要注意自己的代码逻辑即可. 例如:

<?php
$pid = pcntl_fork();
if ($pid == -1) {
    die('fork error');
} else if ($pid>0) {
    echo "爸爸先走了,儿子你好好干活\\n";
    exit(0);
} else {
    while(1){
        echo "1";
        sleep(1);
    }
}

运行结果:

[root@bogon test.cc]# php index.php 
爸爸先走了,儿子你好好干活
1[root@bogon test.cc]# 1111111111111111
[root@bogon test.cc]# 111
[root@bogon test.cc]# 11^C
[root@bogon test.cc]# 11111^C
[root@bogon test.cc]# 11111111111111111111111111111111
[root@bogon test.cc]# 
[root@bogon test.cc]# 

孤儿进程和僵尸进程

僵尸进程

一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。

任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。这是每个 子进程在结束时都要经过的阶段。

如果子进程在exit()之后,父进程没有来得及处理,那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵尸进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。

孤儿进程

一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。

孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。

每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害 。

以上是关于PHP孤儿进程的主要内容,如果未能解决你的问题,请参考以下文章

PHP7之孤儿进程与僵尸进程

PHP 中的僵尸进程孤儿进程详解

php实现多进程多线程

Linux提高:孤儿进程

Linux提高:孤儿进程

linux的僵尸进程和孤儿进程