我有一个程序,我知道它的pid,它有一个信号处理:
$SIG {INT} = sub {.... };
我试图从另一个程序发送信号
my $pid = 5396;
kill 2, $pid or die $!;
并收到错误“......中的参数无效”! 我试着写
kill "INT",$pid or die $!;
kill "INT"=>$pid or die $!;
等。但仍然有这个错误。 为什么呢?
提前致谢。
答案 0 :(得分:1)
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
不正确。在使用不存在的pids进行测试时,我得到了相同的错误。但它确实包含一个数字,因为如果您不提供数字,则会收到此错误:
Can't kill a non-numeric process ID at ...
答案 1 :(得分:1)
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进程一样。
您收到该错误,因为您尝试发送信号的进程没有控制台,并且与发送信号的脚本不共享同一个控制台。