zoukankan      html  css  js  c++  java
  • php多进程pcntl学习-僵尸进程

     上个月写的文章,php多进程pcntl学习(一)现在发现并不完整,因为虽然提到了关闭子进程,但是并没有回收子进程,简单的说就是当子进程比父进程先退出,而父进程没对其做任何处理的时候,子进程将会变成僵尸进程。

    <?php
    $ppid = getmygid();
    $pid = pcntl_fork();
    if ($pid == -1){
    die('fork failed');
    }else if($pid == 0){
    $mypid = getmygid();
    echo 'I am child process. My PID is ' . $mypid . ' and my father is',$ppid.PHP_EOL;
    exit(); //关闭子进程 ,需要配合pcntl_wait使用 , 否则通过ps aux | grep php - >[php] <defunct> 僵尸进程
    }else{
    echo 'Oh my god! I am a father now! My child is'. $pid . ' and mine is ' . $ppid . PHP_EOL;
    //pcntl_wait($status); //回收子进程,避免僵尸进程
    }
    //使主进程挂起
    sleep(100);

      执行命令可以看见,子进程变为僵尸进程

      

      僵尸进程虽然不占什么内存,但是很碍眼,院子里一堆躺着的僵尸怎么都觉得怪怪的。(别忘了它们还占用着PID)

      把12行的注释打开,重新执行脚本测试 ps aux | grep php 可以发现子进程退出后就被回收了.顺便说下,通过信号也是能够做到的

      pcntl_signal(SIGCHLD, SIG_IGN);  //如果父进程不关心子进程什么时候结束,子进程结束后,内核会回收。 

      参考:http://www.jb51.net/article/56301.htm

  • 相关阅读:
    JavaScript-12(事件)
    JavaScript-11(DOM对象)
    JavaScript-10(去重数组)
    js中三元运算符的用法拓展
    JavaScript-5(常见题目-4)
    JavaScript-6(数组的大小排序)
    【CSP-S2019】10.28比赛总结
    【CSP-S2019模拟】10.27比赛总结
    JZOJ6392. 【NOIP2019模拟2019.10.26】僵尸
    【Comet OJ
  • 原文地址:https://www.cnblogs.com/brady-wang/p/10421244.html
Copyright © 2011-2022 走看看