Perl的。发送信号:参数无效

时间:2013-08-22 10:44:12

标签: perl

我有一个程序,我知道它的pid,它有一个信号处理:

 $SIG {INT} = sub {.... };

我试图从另一个程序发送信号

my $pid = 5396;
kill 2, $pid or die $!;

并收到错误“......中的参数无效”! 我试着写

kill "INT",$pid or die $!;
kill "INT"=>$pid or die $!;

等。但仍然有这个错误。 为什么呢?

提前致谢。

2 个答案:

答案 0 :(得分:1)

来自perldoc -f kill

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进程一样。

您收到该错误,因为您尝试发送信号的进程没有控制台,并且与发送信号的脚本不共享同一个控制台。