> Unix / Linux – シグナルとトラップ – ネットワークエンジニアチュートリアル

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

スポンサーリンク

無料でプログラマへ!30歳までなら無料でプログラミング学校に通うことが出来ます。下の画像をクリックして無料相談会でGO!

この章では、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の受信時に実行されるアクションがデフォルトに戻ります。

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

前のページ

スポンサーリンク

ネットワークエンジニアになりたければ下記から無料相談会に参加!
なんと無料で授業を受けれてエンジニアになれます

投稿日:

執筆者: