0

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

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

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

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

并得到一个错误“无效的参数...”!我试着写

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

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

提前致谢。

4

2 回答 2

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是不正确的。使用不存在的 pid 进行测试时出现相同的错误。但是,它确实包含一个数字,因为如果您不提供数字,则会出现以下错误:

Can't kill a non-numeric process ID at ...
于 2013-08-22T12:07:49.440 回答
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 进程相同,否则它将无法工作。

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

于 2013-08-25T13:50:38.653 回答