PHP网络编程-进程控制篇(三)
发表@2019-11-26 09:59:00
更新@2023-03-26 17:03:49
较之pcntl_wait(),pcntl_waitpid()仅多了一个参数:$pid。只是有些复杂:
- <-1:等待任意进程组ID等于参数pid给定值的绝对值的进程
- =-1:等待任意子进程;与pcntl_wait函数行为一致
- =0:等待任意与调用进程组ID相同的子进程
- >0:等待进程号等于参数pid值的子进程
此处,可结合pcntl_wifstopped()稍做演示。在此我需要向诸君说明一个进程的[ 终止 ]和[ 停止 ]是两个决然不同的概念,[ 终止 ]意味着进程君生命周期已经完成,或正常完成或者异常终止;而[ 停止 ]意味着临时挂起,还会复活继续活动。在*NIX中,可以[ kill -STOP pid ]将指定pid的进程临时挂起,此后便可使用pcntl_wifstopped()检测其是否可以挂起停止,与之相反,便可用[ kill -CONT pid ]使之复活。
```php
0 ) {
$a_child_pid[] = $i_pid;
}
}
while( true ) {
if ( count( $a_child_pid ) <= 0 ) {
exit( "所有进程均已终止".PHP_EOL );
}
foreach( $a_child_pid as $i_item_key => $i_item_pid ) {
$i_wait_ret = pcntl_waitpid( $i_item_pid, $i_status, WNOHANG | WUNTRACED | WCONTINUED );
if ( -1 == $i_wait_ret || $i_wait_ret > 0 ) {
unset( $a_child_pid[ $i_item_key ] );
}
// 如果子进程是正常结束
if ( pcntl_wifexited( $i_status ) ) {
// 获取子进程结束时候的 返回错误码
$i_code = pcntl_wexitstatus( $i_status );
echo $i_item_pid."正常结束,最终返回:".$i_code.PHP_EOL;
}
// 如果子进程是被信号终止
if ( pcntl_wifsignaled( $i_status ) ) {
// 获取是哪个信号终止的该进程
$i_signal = pcntl_wtermsig( $i_status );
echo $i_item_pid."由信号结束,信号为:".$i_signal.PHP_EOL;
}
// 如果子进程是[临时挂起]
if ( pcntl_wifstopped( $i_status ) ) {
// 获取是哪个信号让他挂起
$i_signal = pcntl_wstopsig( $i_status );
echo $i_item_pid."被挂起,挂起信号为:".$i_signal.PHP_EOL;
}
// sleep使父进程不会因while导致CPU爆炸.
sleep( 1 );
}
}
```
!!!你们真的以为这就结束了?!!!
永强:你TM快点儿,写完了没,我一个人过不了这一关...
老李:快了快了...
永强:赶紧写完完事儿了,非得整什么新风格,沙雕...说说啥感受?啥感受?...
老李:那家伙...