swoole见的僵尸进程|孤儿进程|进程之间的通讯

Posted zh718594493

tags:

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

一、定义
什么是僵尸进程
维基百科的定义:在类UNIX系统中,僵尸进程是指完成执行(通过exit系统调用,或运行时发生致命错误或收到终止信号所致)但在操作系统的进程表中仍然有一个表项(进程控制块PCB),处于”终止状态”的进程。

这个定义很准确,但并不好理解,通俗的说法是一个进程fork了一个子进程,子进程先于父进程退出,但父进程没有调用wait(通过wait系统调用读取退出进程的退出态,退出进程的在进程表中的表项就被删除),导致这个进程已经退出但是仍在进程表中占有一个位置,这种进程称为僵尸进程。

什么是孤儿进程
孤儿进程:一个进程fork了一个子进程, 父进程先于子进程退出,运行中的子进程称为孤儿进程。
孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

下面,让我们来看2个示例:僵尸进程

echo ppid =  . getmypid(), php_EOL;
 $process = new swoole_process(function (swoole_process $worker) {
    echo pid =  . getmypid(), PHP_EOL;
    sleep(10);
    echo child process exit, PHP_EOL;
}, false);
 
$process->start();
 
sleep(1000);
echo parent process exit, PHP_EOL;
#子进程在父进程没有执行完就退出了,所以会产生僵尸进程
#一般流程是子进程在父进程执行完wait后再退出,

技术图片

 孤儿进程

echo ppid =  . getmypid(), PHP_EOL;
$process = new swoole_process(function (swoole_process $worker) {
    echo pid =  . getmypid(), PHP_EOL;
    sleep(1000);
    echo child process exit, PHP_EOL;
}, false);
$process->start();
sleep(10);
echo parent process exit, PHP_EOL;

技术图片

 

 

4.父进程和子进程之间的通讯

<?php
    #进程之间的通讯
    #主进程写入数据,字进程读取数据,因为在子进程里面有睡眠函数,所以不会出现僵尸进程
    $workers=[];
    $worker_num=2;
    for($i=0;$i<$worker_num;$i++){
        $process = new swoole_process("doprocess",false,false);
        $process->useQueue();
        $pid = $process->start();
        $workers[$pid] = $process;
    }

    function doprocess(swoole_process $process){
        $data = $process->pop();
        echo $data;
        sleep(5);
        $process->exit(0);
    }

    foreach ($workers as $pid => $process) {
        $str="父进程写数据".$pid.PHP_EOL;
        $process->push($str);
    }

    foreach ($workers as $pid => $process) {
        $ret = swoole_process::wait();
    }
?>

 

以上是关于swoole见的僵尸进程|孤儿进程|进程之间的通讯的主要内容,如果未能解决你的问题,请参考以下文章

Python并发编程03/僵尸孤儿进程,互斥锁,进程之间的通信

孤儿进程和僵尸进程

孤儿进程僵尸进程及其回收

孤儿进程僵尸进程及其回收

多任务编程 -- 孤儿进程和僵尸进程

多任务编程 -- 孤儿进程和僵尸进程