kill SIGNAL, LIST
kill SIGNAL

向进程列表发送信号。返回成功用于发送信号的参数数(不一定与实际终止的进程数相同,例如,当进程组被终止时)。

my $cnt = kill 'HUP', $child1, $child2;
kill 'KILL', @goners;

SIGNAL 可以是信号名称(字符串)或信号号。信号名称可以以 SIG 前缀开头,因此 FOOSIGFOO 指代相同的信号。SIGNAL 的字符串形式建议用于便携性,因为相同的信号在不同的操作系统中可能具有不同的编号。

可以在 $Config{sig_name} 中找到当前平台支持的信号名称列表,该列表由 Config 模块提供。有关更多详细信息,请参见 Config

负信号名称与负信号号相同,终止进程组而不是进程。例如,kill '-KILL', $pgrpkill -9, $pgrp 将向指定的整个进程组发送 SIGKILL。这意味着你通常希望使用正信号而不是负信号。

如果 SIGNAL 是数字 0 或字符串 ZERO(或 SIGZERO),则不会向进程发送信号,但 kill 会检查是否可能向其发送信号(简而言之,这意味着该进程归同一用户所有,或者我们是超级用户)。这对于检查子进程是否仍然存活(即使只是作为僵尸进程)并且尚未更改其 UID 非常有用。有关此构造的移植性的说明,请参见 perlport

PROCESS 号为零或负数时,kill 的行为取决于操作系统。例如,在符合 POSIX 的系统上,零将向当前进程组发出信号,-1 将向所有进程发出信号,任何其他负 PROCESS 号都将作为负信号号起作用并终止指定的整个进程组。

如果 SIGNAL 和 PROCESS 都是负数,则结果是未定义的。将来版本中可能会产生警告。

有关更多详细信息,请参阅 perlipc 中的“信号”

在某些平台(如 Windows)上,不可用 fork(2) 系统调用,可以在解释器级别构建 Perl 以模拟 fork。此模拟具有与 kill 相关的限制,在 Windows 上运行的代码和旨在可移植的代码中必须考虑这些限制。

有关更多详细信息,请参阅 perlfork

如果没有进程的 LIST,则不会发送信号,并且返回值为 0。但是,有时会使用此表单,因为它会导致运行污染检查(如果您的 perl 支持污染检查)。但请参阅 perlsec 中的“清洗和检测污染数据”

可移植性问题:perlport 中的“kill”