Unix / Linux – シグナルとトラップ

スポンサーリンク

本当にわからないとこがあった場合一人では解決できません。
『teratail』とはエンジニア特化型のQ&Aサイトです。 すべてのエンジニアさんが抱えている悩みを共有して 解決するための質問サイトです
無料なのでまずは登録して使ってみてください。メールアドレスだけで登録可能です ----------------------------------------------------------------------------------------

この章では、Unixのシグナルとトラップについて詳しく説明します。

信号は、重要なイベントが発生したことを示すためにプログラムに送信されるソフトウェア割り込みです。イベントは、ユーザー要求からハッキングやら何やらまでさまざまです。割り込み信号などの一部の信号は、ユーザーがプログラムに通常の制御フローにない何かを実行するように要求したことを示します。

次の表は、遭遇する可能性があり、プログラムで使用したい一般的な信号をリストしています。

信号名 シグナル番号 説明
SIGHUP 1 制御端末のハングアップまたは制御プロセスの停止
SIGINT 2 ユーザーが割り込み信号(Ctrl + C)を送信すると発行されます。
SIGQUIT 3 ユーザーが終了信号(Ctrl + D)を送信した場合に発行されます。
SIGFPE 8 不正な数学的操作が試みられた場合に発行される
SIGKILL 9 プロセスがこのシグナルを受け取った場合、プロセスは直ちに終了し、クリーンアップ操作を実行しません
SIGALRM 14 アラームクロック信号(タイマー用)
SIGTERM 15 ソフトウェア終了シグナル(デフォルトでkillによって送信される)

信号一覧


システムでサポートされているすべての信号を簡単にリストする方法があります。kill -lコマンドを発行するだけで、サポートされているすべてのシグナルが表示されます。

$ 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      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

実際のシグナルのリストは、Solaris、HP-UX、およびLinuxで異なります。

デフォルトアクション


すべてのシグナルには、それに関連するデフォルトのアクションがあります。シグナルのデフォルトアクションは、スクリプトまたはプログラムがシグナルを受け取ったときに実行するアクションです。

可能なデフォルトアクションのいくつかは –

  • プロセスを終了。
  • 信号を無視する。
  • コアをダンプします。これにより、シグナルを受信したときのプロセスのメモリーイメージを含むcoreというファイルが作成されます。
  • プロセスを停止する。
  • 停止したプロセスを続行する。

信号を送信する


プログラムやスクリプトにシグナルを送るにはいくつかの方法があります。最も一般的なのは、ユーザーがスクリプトの実行中にCONTROL-C キーまたはINTERRUPTキーを入力する方法です。

押すとCtrlキー+ Cのキーを、SIGINTはスクリプトに送信され、定義されたデフォルトのとおりアクションスクリプトは終了します。

シグナルを配信するための他の一般的な方法は、killコマンドを使用することです。その構文は次のとおりです。

$ kill -signal pid

ここでsignalは配信するシグナルの番号または名前のいずれかであり、pidはシグナルを送信するプロセスIDです。例

$ kill -1 1001

上記のコマンドは、プロセスID 1001で実行されているプログラムにHUPまたはハングアップ信号を送信します。killシグナルを同じプロセスに送信するには、次のコマンドを使用します。

$ kill -9 1001

これにより、プロセスID 1001で実行中のプロセスが強制終了されます。

トラッピング信号


押すとCtrlキー+ Cをまたはシェルプログラムの実行中にあなたの端末でBreakキーを、通常、そのプログラムを直ちに終了し、あなたのコマンドプロンプトに戻ります。これは必ずしも望ましいとは限りません。たとえば、クリーンアップされないテンポラリファイルが残ってしまうことがあります。

これらの信号をトラッピングするのは簡単です。また、trapコマンドの構文は次のとおりです。

$ trap commands signals

ここでは、コマンドは任意の有効なUnixコマンド、またはユーザ定義関数であってもよく、signalはトラップしたい任意の数の信号のリストであってもよい。

$ trap 'echo trapped.' 2 ※ 

Ctrl+c を入力する。

 $ trapped.

シェルスクリプトのトラップには2つの一般的な用途があります。

  • 一時ファイルをクリーンアップする
  • 信号を無視する

シグナルを無視する


trapのコマンドがnullの場合、指定されたシグナルは受信時に無視されます。たとえば、コマンド –

$ trap '' 2

これは、割り込み信号が無視されることを指定します。中断したくない操作を実行するときに、特定の信号を無視したい場合があります。以下のように無視する複数の信号を指定することができます –

$ trap '' 1 2 3 15

最初の引数はシグナルが無視されるように指定しなければならず、次のようなものを書くのと同じではないことに注意してください。

$ trap  2

シグナルを無視すると、すべてのサブシェルもそのシグナルを無視します。ただし、シグナルの受信時に実行するアクションを指定すると、すべてのサブシェルはそのシグナルを受信して​​もデフォルトのアクションを実行します。

トラップのリセット


シグナルの受信時に実行されるデフォルトのアクションを変更した後は、最初の引数を省略するだけで、トラップを使って再度変更することができます。そう –

$ trap 1 2

これにより、シグナル1または2の受信時に実行されるアクションがデフォルトに戻ります。

これにてリナックス最終ページです!お疲れ様でした!いつかもっと高度なものをやろうと思います。

前のページ

スポンサーリンク

プログラミングは独学からは挫折の可能性が高いです。まずは無料体験ができる
コードキャンプが本当におすすめ。無料体験でわからないところを聞きましょう。
転職補助つき。カリキュラム終了後に転職紹介をしてくれます。