pcntl_wait 简介

# 来源官方pcntl_wait — 等待或返回fork的子进程状态int pcntl_wait ( int &$status [, int $options = 0 ] )wait函数刮起当前进程的执行直到一个子进程退出或接收到一个信号要求中断当前进程或调用一个信号处理函数。 如果一个子进程在调用此函数时已经退出(俗称僵尸进程),此函数立刻返回。子进程使用的所有系统资源将 被释放。关于wait在您系统上工作的详细规范请查看您系统的wait(2)手册。Note:
这个函数等同于以-1作为参数pid 的值并且没有options参数来调用pcntl_waitpid() 函数。参数
status
pcntl_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) { // 创建错误,返回-1die('进程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的pcntl进程控制教程二(pcntl_wait)相关推荐

  1. 进程控制(二)——minishell延续

    文章目录 进程控制的简单相关回顾 环境变量怎么读取的,如何由父进程让子进程拿到呢? minishell代码排错 为什么子进程获取不到父进程的环境变量呢? 程序替换不会替换父进程的环境变量? minis ...

  2. vbs结束进程代码_物联网学习教程—Linux系统编程之进程控制

    Linux系统编程之进程控制 一.结束进程 首先,我们回顾一下 C 语言中 continue, break, return 的作用: continue: 结束本次循环 break: 跳出整个循环,或跳 ...

  3. 进程控制(二)与linux下的自有服务

    一.进程动态信息查看top 第一部分 统计信息 [root@yunwei1 ~]# top top - 19:22:52 up 1:32, 2 users, load average: 0.00, 0 ...

  4. 操作系统学习笔记——第二章 进程的描述与控制(二)

    2.3 进程控制 进程控制是对系统中的全部进程实施有效的管理,包括进程创建.终止.进程阻塞和唤醒. 一.进程的创建 二.进程的终止 三.进程的阻塞与唤醒 四.进程的挂起与激活 一.进程的创建 创建原语 ...

  5. 【linux草鞋应用编程系列】_2_ 环境变量和进程控制

    一. 环境变量 应用程序在执行的时候,可能需要获取系统的环境变量,从而执行一些相应的操作. 在linux中有两种方法获取环境变量,分述如下. 1.通过main函数的参数获取环境变量 main函数的多种 ...

  6. Konstrukt PHP REST框架 教程二

    Konstrukt PHP REST框架 教程二 入门 - 第2部分 在本教程中,我们假设你已经完成了第一个教程,因为它的基础上产生的代码从该. 谈判的Content-Type 在大多数情况下会发出一 ...

  7. openlayers地图旋转_OpenLayers教程二:实现简单的地图显示

    本文衔接上一篇文章:不睡觉的怪叔叔:OpenLayers教程二:实现简单的地图显示​zhuanlan.zhihu.com 经过上一篇文章对OpenLayers的简单了解以后,现在让我们来实现一个简单的 ...

  8. linux系统进程控制实验报告,Linux进程控制实验报告.doc

    里奴性进程控制实验报告 实验名称: Linux进程控制 实验要求:一.编写一个Linux系统C程序,由父亲创建2个子进程,再由子进程各自从控制台接收一串字符串,保存在各自的全局字符串变量中,然后正常结 ...

  9. MIP开发教程(二) 使用MIP-CLI工具调试MIP网页

    初始化 MIP 配置 新建一个 MIP 网页 编写 MIP 网页代码 校验 MIP 网页 调试 MIP 网页 1. 初始化 MIP 配置 首先在html目录下进行初始化 MIP 配置: $ mip i ...

最新文章

  1. windows环境phpstorm调试环境搭建
  2. 面试题:求最长非重复子序列
  3. 深圳Uber优步司机奖励政策(12月28日到1月3日)
  4. 川崎焊接机器人编程实例_机器人现场编程-川崎机器人示教-综合命令.pptx
  5. 【C++ grammar】Enhancement for Type System (C++11 对类型系统的增强)
  6. mysql shell 所有表_删除mysql数据库中所有表的shell脚本
  7. PancakeBunny获160万美元战略融资,Binance Labs领投
  8. pydicom 显示jpeg压缩图像_图像原理 jpg png tga bmp 存储格式
  9. python怎么导入背景_Pycharm主题设置以及导入方式
  10. python怎么随机分组_Python|random之随机抽人分组
  11. 微信小程序直播为什么这么受欢迎
  12. 数学建模-二胎政策对中国人口的影响
  13. linux可上网limbo镜像,limbo模拟器win10精简版
  14. 【设计鉴赏】精选字体设计鉴赏
  15. oracle系统漏洞补丁包,跪求oracle漏洞补丁包
  16. 同程内网流传的分布式凤凰缓存系统手册,竟遭GitHub强行开源下载
  17. 基于宏指令下的威纶通配方功能(RW位控制)
  18. shopnc数据库操作
  19. win10以太网下出现两个网络 网络2/网络3或者“未识别的网络” 如何删除多余的一个
  20. 完整的iOS直播app

热门文章

  1. STL模板整理 set
  2. SQL Server 2016新特性:Live Query Statistics
  3. OSSIM中配置网络资产监控
  4. IIS7中WCF配置问题集合
  5. java泛型学习三:受限制的通配符以及泛型方法
  6. 做个高颜值的优秀按钮,用 CSS3 实现社交按钮动画
  7. pyqt界面屏幕分辨率自适应_后台系统界面设计踩过的那些坑
  8. linux 权限属性,linux 文件或目录的权限和属性
  9. iis6扩展php_Web服务器IIS6的PHP5.2.5最佳配置方法
  10. 多对多(many-to-many)