1. ホーム
  2. スクリプト・コラム
  3. パール

perlでsignalを使用する例

2022-01-03 09:50:37

シグナルを使って、プログラムをより機能的にしましょう。Linuxで全てのsignalをリストアップするには、kill -lを使用するだけです。以下は私のマシンでの出力です(後でリストアップされない64個があります)。

コピーコード コードは以下の通りです。

xuyang@xuyang-desktop:/$ kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8 ) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS

それぞれの信号について説明します。
以下は、ctrl+cを無効にして(ctrl+cは現在のプログラムにINT信号を発生させる)、現在のプログラムを終了させる例です。

コピーコード コードは以下の通りです。

sub INT_handler {
print("Don't Interrupt!\n");
}

$SIG{'INT'} = 'INT_handler'; #another way is $SIG{'INT'} = \&INT_handler ;

for ($x = 0; $x < 10; $x++) {
print("$x\n");
sleep 1;

ここで、%SIGはPerlの組み込みハッシュで、特にシグナルを処理するためのものです。もしシグナルを無視したい場合は、次のように書きます。

コピーコード コードは以下の通りです。

$SIG{'INT'} = 'IGNORE' ;

デフォルトのケースに戻すには
コピーコード コードは以下の通りです。

$SIG{'INT'} = 'DEFAULT' ;

プログラムに送信するには、ctrl+cを使用する以外に、次のように入力することもできます。
コピーコード コードは以下の通りです。

kill -s INT .

もっと便利なのはSIGUSR1とSIGUSR2で、これはカスタム・シグナルです。この2つのシグナルは、プログラムの中で自由に扱うことができます。そして、このシグナルをトリガーしたいときは、次のようにタイプするだけです。
コピーコード コードは以下の通りです。

kill -s USR1 pid

そして、このシグナルハンドラをトリガーにして、デバッグメッセージのオン・オフや作業モードの切り替えなどを行うことができるのです。もちろん、シグナルはOSの機能なので、perlだけでなく、他の言語でも使えます。構文が違うだけです。