シグナルは、プログラムにとっていつ発生するかわからない、非同期の
イベントです。オペレーティング・システムは、シグナルとして利用可能な
種類を定義し、それぞれに名前と番号を割り振っています。
例えば、SIGINT
は、あなたが Ctrl-c を入力した時に
プログラムが得るシグナルであり; SIGSEGV
はプログラムが利用
可能なメモリ領域を逸脱して参照した時に発生し; SIGALRM
は
(プログラムがアラームを要求した時にのみ発生するのですが)
アラームクロック・タイマの時間が来た時に発生します。
SIGALRM
を含むあるシグナルは、プログラムの機能として正常な
ものです。反面、SIGSEGV
のようなものはエラーを含んでいます;
これらのシグナルは、プログラムが前もってなんらかの方法でシグナルを
処理するように記述されていない限り、(プログラムが即座に kill される
ような) 致命的なものです。
SIGINT
はプログラムのエラーには含まれませんが、Ctrl-c の
結果としてプログラムが kill されるので、普通、致命的です。
GDB には、GDB のコントロールの下で動作するプログラムが発生させる シグナルをキャッチする能力があります。あなたは、GDB に対して、 前もって各々のシグナルをどう処理するのかを指示することができます。
通常、GDB は SIGALRM
のような (そのインタフェースにより
プログラムの機能として働く) エラーでないシグナルを無視するように
設定されています。しかし、エラーシグナルが発生した場合は、即座に
プログラムを停止させます。あなたは、これらの設定を `handle'
コマンドによって変更することができます。この場合、対象となるシグナルを
番号によって指示しなければなりません。
info signal
handle signalnum keywords...
`handle' コマンドを使う場合、あなたは、関心のあるシグナルの コードナンバーを知っておかなければなりません。コードナンバーを知る には、シグナル名と番号の一覧表を表示する `info signal' コマンドを 入力して下さい。
handle コマンドに許可されているキーワードは、短く省略できるように なっています。それらのフルネームは以下の通りです。
stop
print
nostop
noprint
pass
nopass
シグナルがプログラムを停止させるように設定されていたならば、 あなたが処理を継続させない限り、プログラムはシグナルを受け取る ことができません。また、問題のシグナルに対して、その時 `pass' が 有効であれば初めて、プログラムはシグナルを受け取ることができます。 言い換えれば、GDB がシグナルを報告した後で、あなたは `pass' や `nopass' を記述した `handle' コマンドを使って、その直後に プログラムが継続された時にシグナルを見ることができるかどうかを コントロールすることができます。
あなたはまた、`signal' コマンドを使って、プログラムがシグナルを 受け取ることを妨げたり、通常見ることのできないシグナルを見れるように したり、また、いつでも好きなときに好きなシグナルを送ることができます。 See section プログラムへのシグナルの送信。