我有一个程序,我知道它的 pid 并且它有一个信号处理:
$SIG {INT} = sub {.... };
我试图从另一个程序发送信号
my $pid = 5396;
kill 2, $pid or die $!;
并得到一个错误“无效的参数...”!我试着写
kill "INT",$pid or die $!;
kill "INT"=>$pid or die $!;
等,但仍然有这个错误。为什么?
提前致谢。
我有一个程序,我知道它的 pid 并且它有一个信号处理:
$SIG {INT} = sub {.... };
我试图从另一个程序发送信号
my $pid = 5396;
kill 2, $pid or die $!;
并得到一个错误“无效的参数...”!我试着写
kill "INT",$pid or die $!;
kill "INT"=>$pid or die $!;
等,但仍然有这个错误。为什么?
提前致谢。
kill SIGNAL, LIST
kill SIGNAL
Sends a signal to a list of processes. Returns the number of
processes successfully signaled (which is not necessarily the
same as the number actually killed).
该错误具有误导性。该kill
函数返回成功发出信号的进程数,在这种情况下可能为零0
。它没有任何关于失败原因的有效信息,因此它设置$!
为一个相当通用的消息。
如果我猜测,我会说你$pid
是不正确的。使用不存在的 pid 进行测试时出现相同的错误。但是,它确实包含一个数字,因为如果您不提供数字,则会出现以下错误:
Can't kill a non-numeric process ID at ...
Windows 没有信号。这是一个unix的事情。然而,Perl 确实尝试对它们进行一点模仿。
kill INT => $pid
结果是GenerateConsoleCtrlEvent(CTRL_C_EVENT, pid)
kill BREAK => $pid
结果是GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, pid)
kill TERM => $pid
结果是GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, pid)
kill KILL => $pid
结果是TerminateProcess(process_handle, sig)
GenerateConsoleCtrlEvent
只能发出信号“共享与调用进程关联的控制台的控制台进程组”,因此除非您尝试向其发送信号的进程具有控制台并且它与您的 Perl 进程相同,否则它将无法工作。
您收到该错误是因为您尝试向其发送信号的进程没有控制台,并且与发送信号的脚本不共享相同的控制台。