background image

      注意两点:
      1. 子进程最好有一个 exit;语句,防止不必要的出错;
      2. pcntl_fork 间最好不要有其它语句,例如:
$pid = pcntl_fork();
//这里最好不要有其他的语句
if ($pid == -1) {
die('could not fork');
} else if ($pid) {
// we are the parent
pcntl_wait($status); //Protect against Zombie children
} else {
// we are the child
}
   5. pcntl_wait ( int &$status [, int $options ] )
      阻塞当前进程,只到当前进程的一个子进程退出或者收到一个结束当前进程的信号。使

$status 返回子进程的状态码,并可以指定第二个参数来说明是否以阻塞状态调用:

      1. 阻塞方式调用的,函数返回值为子进程的 pid,如果没有子进程返回值为-1;
      2. 非阻塞方式调用,函数还可以在有子进程在运行但没有结束的子进程时返回 0。
   6. pcntl_waitpid ( int $pid , int &$status [, int $options ] )
      功能同 pcntl_wait,区别为 waitpid 为等待指定 pid 的子进程。当 pid 为-1 时 pcntl_waitpid

pcntl_wait 一样。在 pcntl_wait 和 pcntl_waitpid 两个函数中的$status 中存了子进程的状态

 

pcntl_wifexited

pcntl_wifstopped

pcntl_wifsignaled

pcntl_wexitstatus

 

pcntl_wtermsig、pcntl_wstopsig、pcntl_waitpid 这些函数。
      例如:
       $pid = pcntl_fork();
if($pid) {
pcntl_wait($status);
$id = getmypid();
echo “parent process,pid {$id}, child pid {$pid}n”;
}else{
$id = getmypid();
echo “child process,pid {$id}n”;
sleep(2);
}
?>
      子进程在输出 child process 等字样之后 sleep 了 2 秒才结束,而父进程阻塞着直到子进程
退出之后才继续运行。
   7. pcntl_getpriority ([ int $pid [, int $process_identifier ]] )
      取得进程的优先级,即 nice 值,默认为 0,在我的测试环境的 linux 中(CentOS release 
5.2 (Final)),优先级为-20 到 19,-20 为优先级最高,19 为最低。(手册中为-20 到 20)。
   8. pcntl_setpriority ( int $priority [, int $pid [, int $process_identifier ]] )
      设置进程的优先级。
   9. posix_kill