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见的僵尸进程|孤儿进程|进程之间的通讯的主要内容,如果未能解决你的问题,请参考以下文章