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

Windows には信号がありません。それはユニックスのことです。ただし、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 に答える
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 に答える