等待特定子进程终止,并返回已终止进程的 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"。