zoukankan      html  css  js  c++  java
  • pcntl_waitpid函数解释

    pcntl_waitpid

    等待或返回fork的子进程状态。
    多进程的主进程创建了子进程,那主进程如何确认子进程的状态呢。 假如主进程需要根据子进程的状态做不同的处理呢, 这里的状态包括子进程被kill掉,或变成僵尸进程等。 pcntl_waitpid就可以获取子进程的状态码, 通过这个状态码, 就可知道子进程处于什么状态
    他的用法:

    int pcntl_waitpid ( int $pid , int &$status [, int $options = 0 ] )
    

    返回的值可以是-1,0或者 >0的值, 如果是-1, 表示子进程出错, 如果>0表示子进程已经退出且值是退出的子进程pid,至于如何退出, 可以通过$status状态码反应。 那什么时候返回0呢, 只有在option 参数为 WNOHANG且子进程正在运行时0, 也就是说当设置了options=WNOHANG时, 如果子进程还没有退出, 此时pcntl_waitpid就会返回0
    另外, 如果不设置这个参数为WNOHANG, pcntl_waitpid 就会阻塞运行, 直到子进程退出, 至于option的另外一个值WUNTRACED, 暂未理解, 不表

    那么如何根据$status(状态码)判断进程是如何退出呢, 如下(参数都是$status)

    pcntl_wifexited

    这个函数可以根据$status 判断进程是否正常退出, 何为正常退出, 比如exit

    pcntl_wexitstatus

    这个函数仅在pcntl_wifexited 返回True(即正常退出)时有效, 且返回子进程退出的返回状态码, 这个返回状态码可以通过exit($s)的参数($s必须为整数时)定义

    pcntl_wifsignaled

    检查子进程状态码是否代表由于某个信号而中断, 比如是不是我们给他发送了term, int 等信号了

    pcntl_wexitstatus

    假如是发送信号而导致子进程中断, 那么这个信号是什么信号呢, 这个函数就是获取这个信号的

    pcntl_wifstopped

    仅当option选项为WUNTRACED时有效, 未理解, 不表

    pcntl_wtermsig

    同上

    综合实例代码:

    $res = pcntl_waitpid($pid, $status, WNOHANG);
    //FileLog::log("pid is $pid; wait result is $res");
    if($res == -1 || $res > 0){
        if(!pcntl_wifexited($status)){
            //进程非正常退出
            FileLog::log("service stop unusally; pid is $pid");
        }else{
            //获取进程终端的退出状态码;
            $code = pcntl_wexitstatus($status);
            FileLog::log("service stop code: $code;pid is $pid ");
        }
    
        if(pcntl_wifsignaled($status)){
            //不是通过接受信号中断
            FileLog::log("service stop not by signal;pid is $pid ");
        }else{
            $signal = pcntl_wtermsig($status);
            FileLog::log("service stop by signal $signal;pid is $pid");
        }
    }
    

    上面的这个代码就通过根据pcntl_waitpid的返回结果和状态码对子进程因为不同原因中断做了不同的处理

  • 相关阅读:
    JDBC中DAO+service设计思想
    Ajax的简单基础
    Ajax的简单基础
    Jquery选择器总结二
    Jquery选择器总结二
    Jquery选择器总结一
    Jquery选择器总结一
    amazon的新算法《大数据时代:亚马逊“预判发货”,顾客未动包裹先行》
    wget命令检测端口是否监听
    KUNG FU PANDA
  • 原文地址:https://www.cnblogs.com/dongruiha/p/6396483.html
Copyright © 2011-2022 走看看