1

Windowsでperl v14を使用しています。私は2つの単純なファイルを持っています:

$SIG{'INT'} = sub {
                print "got SIGINT\n";
                                    #some useful code to be executed
                                    #on reception of signal
};

$SIG{'ALRM'} = sub {
                print "got SIGALRM\n";
};
print "my pid: ",$$,"\n";
while(1)
{
    print "part 1\n";
    sleep(3);
    print "part 2\n\n";
    sleep(3);
}

上記のファイルが開始され、pid を指定して強制終了されるのを待ちます。2 番目のファイルは、pid (手動で設定) を使用して最初の perl プロセスを単純に強制終了します。

$pid = xxxx;  #this is the manually entered pid for I process
print "will attempt to kill process: $pid\n";
kill INT, $pid;

最初の perl スクリプトを実行して Ctrl-C を押すと、ハンドラーは期待どおりに動作しますが、2 番目のファイルを使用すると同じ結果が得られません。ALRM、HUP、TERM、FPE などの他のシグナルも試しましたが、成功しませんでした。やりたいことは、シグナル ハンドラでコードを実行することだけです。

win32 のINT2 シグナルと呼ばれるものを見つけました。

前もって感謝します。

4

1 に答える 1

2

Windows では、同じスレッド内でのみシグナルを使用できます。したがって、異なるプロセスにシグナルを送ることは機能しません。

シグナルの代わりに、ソケット、パイプ、ファイルなどのプロセス間通信の他の方法を使用できます。

perlwin32から:

シグナル処理は、Unix プラットフォームのように動作しない場合があります (正確に「動作」しない場合も :)。たとえば、シグナル ハンドラーから die() または exit() を呼び出すと例外が発生します。これは、Windows での signal() のほとんどの実装が大幅に機能していないためです。したがって、シグナルは、ハンドラーでフラグ変数を設定するなどの単純なことに対してのみ機能する場合があります。このポートでの信号の使用は、現在サポートされていないと考えるべきです。

于 2012-07-11T08:42:03.983 に答える