waitpid PID,FLAGS

等待特定子进程终止,并返回已终止进程的 pid,如果不存在这样的子进程,则返回 -1。非阻塞等待(在 FLAGS 中使用 WNOHANG)如果存在与 PID 匹配的子进程但尚未终止,则可以返回 0。状态在 $?${^CHILD_ERROR_NATIVE} 中返回。

PID 为 0 表示等待任何进程组 ID 等于当前进程的子进程。PID 小于 -1 表示等待任何进程组 ID 等于 -PID 的子进程。PID 为 -1 表示等待任何子进程。

如果你说

use POSIX ":sys_wait_h";

my $kid;
do {
    $kid = waitpid(-1, WNOHANG);
} while $kid > 0;

或者

1 while waitpid(-1, WNOHANG) > 0;

那么你可以对所有挂起的僵尸进程进行非阻塞等待(参见 "WAIT" in POSIX)。非阻塞等待在支持 waitpid(2)wait4(2) 系统调用的机器上可用。但是,在任何地方都实现了使用 FLAGS 为 0 等待特定 pid。(Perl 通过记住已退出但尚未被 Perl 脚本收割的进程的状态值来模拟系统调用。)

请注意,在某些系统上,返回值为 -1 可能意味着子进程正在被自动收割。有关详细信息以及其他示例,请参见 perlipc

可移植性问题:"perlport 中的 waitpid"