各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案各类知识收集,PHP技术分享与解决方案

Str Tom,为分享PHP技术和解决方案,贡献一份自己的力量!
收藏本站(不迷路),每天更新好文章!
当前位置:首页 > CMS教程 > PHP

PHP的pcntl进程控制之pcntl_wait

管理员 2023-09-05
PHP
121

PHP的pcntl进程控制之pcntl_wait

内容导读

收集整理的这篇技术教程文章主要介绍了PHP的pcntl进程控制之pcntl_wait,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含5091字,纯文字阅读大概需要8分钟

内容图文

这篇文章主要介绍了关于PHP的pcntl进程控制之pcntl_wait,有着一定的参考价值,现在分享给大家,有需要的朋友可以参考一下

pcntl_wait 简介

# 来源官方pcntl_wait — 等待或返回fork的子进程状态int pcntl_wait ( int &$status [, int $options = 0 ] )wait函数刮起当前进程的执行直到一个子进程退出或接收到一个信号要求中断当前进程或调用一个信号处理函数。 如果一个子进程在调用此函数时已经退出(俗称僵尸进程),此函数立刻返回。子进程使用的所有系统资源将 被释放。关于wait在您系统上工作的详细规范请查看您系统的wait(2)手册。Note:这个函数等同于以-1作为参数pid 的值并且没有options参数来调用pcntl_waitpid() 函数。参数statuspcntl_wait()将会存储状态信息到status 参数上,这个通过status参数返回的状态信息可以用以下函数 pcntl_wifexited(), pcntl_wifstopped(), pcntl_wifsignaled(), pcntl_wexitstatus(), pcntl_wtermsig()以及 pcntl_wstopsig()获取其具体的值。options如果您的操作系统(多数BSD类系统)允许使用wait3,您可以提供可选的options 参数。如果这个参数没有提供,wait将会被用作系统调用。如果wait3不可用,提供参数 options不会有任何效果。options的值可以是0 或者以下两个常量或两个常量“或运算”结果(即两个常量代表意义都有效)。options可用值WNOHANG    如果没有子进程退出立刻返回。WUNTRACED    子进程已经退出并且其状态未报告时返回。返回值pcntl_wait()返回退出的子进程进程号,发生错误时返回-1,如果提供了 WNOHANG作为option(wait3可用的系统)并且没有可用子进程时返回0。

测试代码

<?php/** * Created by PhpStorm. * User: Object * Date: 2018/6/11 * Time: 10:28 */if (strtolower(php_sapi_name()) != 'cli') {    die("请在cli模式下运行");}$index = 0;$loop = 1;while ($index < $loop) {    echo "当前进程:" . getmypid() . PHP_EOL;    $pid = pcntl_fork(); //fork出子进程    if ($pid == -1) { // 创建错误,返回-1        die('进程fork失败');    } else if ($pid) { // $pid > 0, 如果fork成功,返回子进程id        // 父进程逻辑        pcntl_wait($status); // 父进程必须等待一个子进程退出后,再创建下一个子进程。        $child_id = $pid; //子进程的ID        $pid = posix_getpid(); //获取当前进程Id        $ppid = posix_getppid(); // 进程的父级ID        $time = microtime(true);        echo "我是父进程,fork的子进程id: {$child_id};当前进程id:{$pid};父进程id:{$ppid}; 当前index:{$index}; 当前时间:{$time}".PHP_EOL;    } else { // $pid = 0        // 子进程逻辑        $cid = $pid;        $pid = posix_getpid();        $ppid = posix_getppid();        $myid = getmypid();        $time = microtime(true);        echo "我是子进程,当前进程id:{$pid};父进程id:{$ppid}; 当前index:{$index}; 当前时间:{$time}".PHP_EOL;        //exit;        //sleep(2);    }    $index++;}

loop = 1 执行结果

当前进程:16604我是子进程,当前进程id:16605;父进程id:16604; 当前index:0; 当前时间:1528696774.1978我是父进程,fork的子进程id: 16605;当前进程id:16604;父进程id:15128; 当前index:0; 当前时间:1528696774.2032

loop = 2 执行结果

当前进程:16613我是子进程,当前进程id:16614;父进程id:16613; 当前index:0; 当前时间:1528696781.4751当前进程:16614我是子进程,当前进程id:16615;父进程id:16614; 当前index:1; 当前时间:1528696781.4756我是父进程,fork的子进程id: 16615;当前进程id:16614;父进程id:16613; 当前index:1; 当前时间:1528696781.4802我是父进程,fork的子进程id: 16614;当前进程id:16613;父进程id:15128; 当前index:0; 当前时间:1528696781.4858当前进程:16613我是子进程,当前进程id:16616;父进程id:16613; 当前index:1; 当前时间:1528696781.4863我是父进程,fork的子进程id: 16616;当前进程id:16613;父进程id:15128; 当前index:1; 当前时间:1528696781.4913

loop = 3 执行结果

当前进程:16625我是子进程,当前进程id:16626;父进程id:16625; 当前index:0; 当前时间:1528696787.3334当前进程:16626我是子进程,当前进程id:16627;父进程id:16626; 当前index:1; 当前时间:1528696787.3338当前进程:16627我是子进程,当前进程id:16628;父进程id:16627; 当前index:2; 当前时间:1528696787.3345我是父进程,fork的子进程id: 16628;当前进程id:16627;父进程id:16626; 当前index:2; 当前时间:1528696787.3391我是父进程,fork的子进程id: 16627;当前进程id:16626;父进程id:16625; 当前index:1; 当前时间:1528696787.3434当前进程:16626我是子进程,当前进程id:16629;父进程id:16626; 当前index:2; 当前时间:1528696787.3441我是父进程,fork的子进程id: 16629;当前进程id:16626;父进程id:16625; 当前index:2; 当前时间:1528696787.3496我是父进程,fork的子进程id: 16626;当前进程id:16625;父进程id:15128; 当前index:0; 当前时间:1528696787.3543当前进程:16625我是子进程,当前进程id:16630;父进程id:16625; 当前index:1; 当前时间:1528696787.3548当前进程:16630我是子进程,当前进程id:16631;父进程id:16630; 当前index:2; 当前时间:1528696787.3555我是父进程,fork的子进程id: 16631;当前进程id:16630;父进程id:16625; 当前index:2; 当前时间:1528696787.3599我是父进程,fork的子进程id: 16630;当前进程id:16625;父进程id:15128; 当前index:1; 当前时间:1528696787.3643当前进程:16625我是子进程,当前进程id:16632;父进程id:16625; 当前index:2; 当前时间:1528696787.3649我是父进程,fork的子进程id: 16632;当前进程id:16625;父进程id:15128; 当前index:2; 当前时间:1528696787.3697

总结

1.从执行的多次结果得知,程序从外到内创建fork。然后再从内最后一次fork开始退出
2.如一次fork之后,程序的父进程因pcntl_wait阻塞,然后等待本次fork的子进程退出,然后相应的子进程的父进程执行逻辑并退出
3.然后执行本子进程的父进程依次循环2的逻辑退出,最终结束总进程

以上就是本文的全部内容,希望对大家的学习有所帮助,更多相关内容请关注PHP中文网!

相关推荐:

以上就是PHP的pcntl进程控制之pcntl_wait的详细内容,更多请关注Gxl网其它相关文章!

内容总结

以上是为您收集整理的PHP的pcntl进程控制之pcntl_wait全部内容,希望文章能够帮你解决PHP的pcntl进程控制之pcntl_wait所遇到的程序开发问题。 如果觉得技术教程内容还不错,欢迎将网站推荐给程序员好友。

内容备注

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

扫码关注

qrcode

QQ交谈

回顶部