标签:php pre 进程 并行 收集 div exe array 僵尸进程
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。
僵尸进程:一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。这种进程称之为僵死进程。
僵尸进程危害:如果进程不调用wait / waitpid的话, 那么保留的那段信息就不会释放,其进程号就会一直被占用,但是系统所能使用的进程号是有限的,如果大量的产生僵死进程,将因为没有可用的进程号而导致系统不能产生新的进程. 此即为僵尸进程的危害,应当避免。任何一个子进程(init除外)在exit()之后,并非马上就消失掉,而是留下一个称为僵尸进程(Zombie)的数据结构,等待父进程处理。
已经产生的僵尸进程,解决方法:kill掉父进程,它产生的僵死进程就变成了孤儿进 程,这些孤儿进程会被init进程接管,init进程会wait()这些孤儿进程,释放它们占用的系统进程表中的资源。
僵尸进程解决办法
(1)通过信号机制
子进程退出时向父进程发送SIGCHILD信号,父进程处理SIGCHILD信号。在信号处理函数中调用wait进行处理僵尸进程。
(2)fork两次
《Unix 环境高级编程》8.6节说的非常详细。原理是将子进程成为孤儿进程,从而其的父进程变为init进程,通过init进程可以处理僵尸进程。
1 /** 2 * 入口函数 3 * 将此文件保存为 ProcessOpera.php 4 * 在terminal中运行 /usr/local/php/bin/php ProcessOpera.php & 5 * 查看进程 ps aux|grep php 6 */ 7 8 9 ProcessOpera("runCode", array(), 8); 10 11 /** 12 * run Code 13 */ 14 function runCode($opt = array()) { 15 //需要在守护进程中运行的代码 16 } 17 18 /** 19 * $func为子进程执行具体事物的函数名称 20 * $opt为$func的参数 数组形式 21 * $pNum 为fork的子进程数量 22 */ 23 function ProcessOpera($func, $opts = array(), $pNum = 1) { 24 while(true) { 25 $pid = pcntl_fork(); 26 if($pid == -1) { 27 exit("pid fork error"); 28 } 29 if($pid) { 30 static $execute = 0; 31 $execute++; 32 if($execute >= $pNum) { 33 pcntl_wait($status); 34 $execute--; 35 } 36 } else { 37 while(true) { 38 //somecode 39 $func($opts); 40 sleep(1); 41 } 42 exit(0); 43 } 44 } 45 }
标签:php pre 进程 并行 收集 div exe array 僵尸进程
原文地址:http://www.cnblogs.com/binghuo000/p/6401123.html