0

以下のコードでは、children プロセスを待っていませんが、実行後にゾンビ プロセスがないのはなぜですか?
私の理解では、この状態で生成されたゾンビ プロセス: 親プロセスはその子に対して '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);
?>
4

2 に答える 2

1

親がそれらを刈り取るか死ぬまで、それらはゾンビプロセスにすぎません。それらが再親化されるとinit、それらは刈り取られ、もはや存在しません。

于 2012-07-25T04:18:10.727 に答える