资讯专栏INFORMATION COLUMN

PHP的pcntl进程控制教程二(pcntl_wait)

MartinDai / 2270人阅读

摘要:简介来源官方等待或返回的子进程状态函数刮起当前进程的执行直到一个子进程退出或接收到一个信号要求中断当前进程或调用一个信号处理函数。子进程使用的所有系统资源将被释放。子进程已经退出并且其状态未报告时返回。

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。
测试代码
 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的逻辑退出,最终结束总进程

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/28791.html

相关文章

  • PHPpcntl进程控制教程三(多进程消费模型)

    摘要:多进程消费模型父进程等待并控制子进程的退出思路整理父进程开启后,直接获取到子进程的,然后存入数组,子进程出来后直接开启业务消费代码,然后退出,然后父进程等待子进程退出,全部退出后父进程结束代码请在模式下运行子进程的数量如果是资源类型的变量, 多进程消费模型 父进程等待并控制子进程的退出 思路整理 父进程开启后,直接获取到子进程的pid,然后存入child数组,子进程fork出来后直接开...

    617035918 评论0 收藏0
  • pcntl扩展学习笔记一(pcntl_fork与pcntl_wait,串行执行分析)

    摘要:对编程的理解,应该到深入到操作系统级别。进程控制,我一直都没有接触,感觉好高端,今天啃了一下扩展的最简单的两个函数,有点心得,记录一下吧,欢迎抛砖。 对编程的理解,应该到深入到操作系统级别。进程控制,我一直都没有接触,感觉好高端,今天啃了一下pcntl扩展的最简单的两个函数,有点心得,记录一下吧,欢迎抛砖。新建代码文件 pcntl_wait.php,如下: $i = 0; ...

    TesterHome 评论0 收藏0
  • 从0到1优雅实现PHP进程管理

    摘要:目的综上所述,我的目标就是实现基于模式实现的多进程管理工具。备注下文中,父进程统称为子进程统称为。最后我们通过下图来简单的总结和描述这个多进程实现的过程控制上面实现了多进程和多进程的常驻内存,那如何去管理呢答案多进程通信。 _ | | _ __ __ _ _ __...

    lakeside 评论0 收藏0
  • PHP 进程实现与管理

    摘要:运行模式实现进程前,需了解常见的的运行模式通用网关接口模式模式命令行模式模块模式作为服务器模块而进程则是使用命令行模式运行的基本实现中提供了一个扩展,可以利用操作系统的调用来实现多进程。 应用场景 一些耗时任务: 大数据表分表后的统计信息功能 分批发送短信或邮件功能 其他可分目标的任务功能(很多种) 所以我们就需要一个常驻内存的任务管理工具,为了保证实时性,一方面我们让它一直执行任...

    MockingBird 评论0 收藏0
  • PHP 进程实现与管理

    摘要:运行模式实现进程前,需了解常见的的运行模式通用网关接口模式模式命令行模式模块模式作为服务器模块而进程则是使用命令行模式运行的基本实现中提供了一个扩展,可以利用操作系统的调用来实现多进程。 应用场景 一些耗时任务: 大数据表分表后的统计信息功能 分批发送短信或邮件功能 其他可分目标的任务功能(很多种) 所以我们就需要一个常驻内存的任务管理工具,为了保证实时性,一方面我们让它一直执行任...

    testbird 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<