Perl:%SIGによるシグナルの制御
技術ドキュメント目次 -> Perl -> %SIGによるシグナルの制御本技術ドキュメントは、2002~2004年頃に作成したものが多いです。
内容が古くなっていることもあるかと思いますが、ご了承ください。
【低価格SSL証明書】弊社運営の低価格SSL証明書販売サイト、翌月末払いなど請求書払いも可能。
◆ %SIGによるシグナルの制御
%SIGという特殊な連想配列の値を変更することで、Perl のスクリプトの中からもシグナルの制御を行うことが可能になります。
次のような構文でシグナルを受け取った時に処理されるサブルーチンを指定することができます。
$SIG{シグナル名} = サブルーチン名; |
例えば、プログラム実行中に Ctrl-C を入力したので、
プログラムがSIGINTを受け取るような例として、
次のようなコードがあった場合、
sub MySighandler { if (-f "./test.txt") { print STDERR "removing ./test.txt ...\n"; unlink ("./test.txt"); } exit(0); } open(FILE, "> ./test.txt"); close(FILE); $SIG{'INT'} = 'MySighandler'; sleep(100); print STDERR "exiting...\n"; exit(0); |
それを実行すると次のようになります。
$ perl test.pl (すぐ、Ctrl-C を入力して終了させる) removing ./test.txt ... $ |
プログラムが途中で終了してしまったときに、
作業ファイルを残さないようにするときなどに便利です。
◆ シグナルの制御をデフォルトに戻すには
次のような指定を行うことで、シグナルの制御をデフォルトの状態に戻すことができます。
$SIG{シグナル名} = 'DEFAULT'; |
メインロジックの処理途中にのみシグナルの制御を独自に変更したい場合には、
次のようにするのがいいかと思います。
$SIG{'INT'} = 'MySighandler'; $SIG{'TERM'} = 'MySighandler'; { ......(メインロジック) } $SIG{'INT'} = 'DEFAULT'; $SIG{'TERM'} = 'DEFAULT'; |
◆ シグナルを無視するには
次のように、'IGNORE' を代入することで、シグナルを受け取ったときにそれを無視するようにできます。
$SIG{シグナル名} = 'IGNORE'; |
◆ シグナルの一覧を確認
kill -l コマンドを実行することで、そのOS環境で実装されているシグナルの一覧を確認することができます。
$ 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 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 32) SIGRTMIN 33) SIGRTMIN+1 34) SIGRTMIN+2 35) SIGRTMIN+3 36) SIGRTMIN+4 37) SIGRTMIN+5 38) SIGRTMIN+6 39) SIGRTMIN+7 40) SIGRTMIN+8 41) SIGRTMIN+9 42) SIGRTMIN+10 43) SIGRTMIN+11 44) SIGRTMIN+12 45) SIGRTMIN+13 46) SIGRTMIN+14 47) SIGRTMIN+15 48) SIGRTMAX-15 49) SIGRTMAX-14 50) SIGRTMAX-13 51) SIGRTMAX-12 52) SIGRTMAX-11 53) SIGRTMAX-10 54) SIGRTMAX-9 55) SIGRTMAX-8 56) SIGRTMAX-7 57) SIGRTMAX-6 58) SIGRTMAX-5 59) SIGRTMAX-4 60) SIGRTMAX-3 61) SIGRTMAX-2 62) SIGRTMAX-1 63) SIGRTMAX $ |
■ Perl についての他のドキュメント
- %SIGによるシグナルの制御
- CSV等区切り文字で連結されたデータを操作(joinとsplit)
- Digest::MD5
- Digest::SHA1
- localtime()やgmtime()をスカラーで評価
- 正規表現において // の代わりに || を使用する
- 正規表現における () と (?:) の違い
- 配列・連想配列を条件に基づいてソート(sort)
■ 他のグループのドキュメント
Apache / Linux / FreeBSD / OpenSSL / Perl / HTTPプロトコル / Jakarta Tomcat / Java / NetBSD / Oracle / PostgreSQL / UNIX の C言語 / UNIX のコマンド / Windows / bind / システム運用TIPS