由于我没有在以下代码中等待子进程,但运行后没有僵尸进程,为什么呢? 根据我的理解,在这种情况下生成的僵尸进程:父进程退出而不为其子进程调用'wait'或'waitpid',因此系统进程 init 选择这些子进程,这称为僵尸进程,是不是?
<?php
define("PC", 10); // Process Count
if (!function_exists('posix_mkfifo')) {
die("posix_mkfifo not existing\n");
}
if (!function_exists('pcntl_fork')) {
die("pcntl_fork not existing");
}
// create pipe
$sPipePath = "my_pipe.".posix_getpid();
if (!posix_mkfifo($sPipePath, 0666)) {
die("create pipe {$sPipePath} error");
}
$arrPID = array();
for ($i = 0; $i < PC; ++$i ) {
$nPID = pcntl_fork(); // create a child process
if ($nPID == 0) {
// children
$oW = fopen($sPipePath, 'w');
fwrite($oW, $i."\n");
fclose($oW);
exit(0); // child end
}elseif($nPID > 0) {
// parent
//array_push($arrPID, $nPID);
//while($pid = pcntl_wait($nStatus, WNOHANG OR WUNTRACED) > 0) {
//echo "$pid exit\n";
//}
}
}
// wait for all child process
//foreach($arrPID as $nPID){
//echo "$nPID\n";
//pcntl_waitpid($nPID, $nStatus); // cause process undead
//pcntl_wait($nStatus);
//}
// parent
$oR = fopen($sPipePath, 'r');
$sData = '';
while(!feof($oR)) {
$sData .= fread($oR, 1024);
}
fclose($oR);
unlink($sPipePath); // remove pipe
//check result
$arr2 = explode("\n", $sData);
$map = array();
foreach($arr2 as $i) {
if (is_numeric(trim($i))) {
$map[trim($i)] = '';
}
}
echo count($map) == PC ? 'ok' : "error count " . count($map);
?>
答案 0 :(得分:1)
他们只是僵尸进程,直到他们的父母收获或死亡。一旦他们被重新归属init
,他们就会被收获,因此不再存在。
答案 1 :(得分:0)
您错误地理解了僵尸进程。
处理流程
1。每当任何子进程终止时,它都会向父进程发送一些信号, 然后父进程向os发送请求以删除该子进程的表。
2。假设您的子进程在您的父进程处于睡眠状态的同时终止,那么现在父进程没有收到任何信号。
3。现在,尽管子进程终止了,但它仍然保留并占用进程ID以及进程表中的空间。 现在您可以说您的子进程变成了僵尸。
实用场景: 每个新进程都分配有唯一的进程ID。 如果存在许多僵尸进程,则由于进程ID受到限制
,您将无法创建新进程