狠狠撸

狠狠撸Share a Scribd company logo
シグナルシグナル
USP 友の会
今泉光之
@bsdhack
https://bsdhack.org
シグナル 2
講師講師
● 今泉光之
 UNIX/Linux環境でのプログラミングを中心に、ネットワークや
インフラなども含め20年以上に渡る経験だけは積んできました。
 当初はC言語でコンパイラ、Xサーバ、ドライバ、TCP/IPによる
通信などシステム系のプログラミングが主でしたが、最近はPerl
やPHPなどのWeb向けのLLも使っています。
シグナル 3
シグナルとはシグナルとは
● プロセス間通信の手段
● 非同期のイベントを通知する仕組み
● 宛先プロセスの処理に割り込む
シグナル 4
シグナルは割り込みシグナルは割り込み
シグナル 5
シグナルと割り込みシグナルと割り込み
● シグナルはソフトウェア由来
● 割り込みはハードウェア由来
※ 個人の感想であり、出典?一次ソースを示すものでは
ありません。
シグナル 6
シグナルの種類(抜粋)シグナルの種類(抜粋)
● ハングアップ (SIGHUP)
元々は電話が切れた事を通知した。シグナル番号 1 。
● 割り込み (SIGINT)
端末から割り込みキー (Ctrl+C) で発生。シグナル番号 2 。
● 終了 (SIGQUIT)
端末から終了キー (Ctrl+) で発生。シグナル番号3。
● 強制終了 (SIGTERM)
プロセスを強制的に終了させる。シグナル番号15.
シグナル 7
シグナル受信時の挙動シグナル受信時の挙動
● 無視する
何もなかったかの様に粛々と動作を続ける
● デフォルトの動作を実行する
システム( OS )によって定義された動作を実施する
● 捕捉する
独自の処理を定義して実施する
シグナル 8
シグナルハンドラシグナルハンドラ
● シグナルを受信した時に実行される処理
● 登録されていない場合は OS によってデフォルトの挙動
– SIGHUP プロセスの終了。
– SIGINT プロセスの終了。
– SIGQUIT プロセスの終了とコアダンプ。
– SIGTERM プロセスの終了。
シグナル 9
シグナルハンドラの登録シグナルハンドラの登録
●
シェルでは trap(1) を利用する
● 基本的にはシェルの組み込みコマンド
● シグナルの種類と受け取った時の処理を指定する
trap [ 処理 ] シグナル [ … シグナル ]
● シグナルはシンボルでも数字でも指定可能
シグナル 10
シグナルハンドラの複数指定シグナルハンドラの複数指定
●
シグナルの種類毎に複数の trap(1) を指定できる
trap 処理 1 HUP もしくは trap 処理 1 1
trap 処理 2 INT もしくは trap 処理 2 2
trap 処理 3 QUIT もしくは trap 処理 3 3
trap 処理 15 TERM もしくは trap 処理 15 15
シグナル 11
疑似シグナル疑似シグナル EXITEXIT
● 終了時のハンドラ。シグナル番号は 0
実際のシグナルではないが trap(1) に指定できる
● プロセスが終了するときに実行させる処理を登録
trap 終了処理 EXIT もしくは trap 終了処理 0
● シグナルを受信した場合も同様
trap 終了処理 0 1 2 3 15
シグナル 12
traptrap のアクションのアクション
●
trap(1) のアクションは省略可
– アクションを省略するとデフォルトの挙動に戻す
trap 1 2 3
●
trap(1) のアクションに空文字列を指定すると無視
trap '' 1 2 3
●
trap(1) のアクションは終了しない
明示的に exit(1) して終了させる必要がある
シグナル 13
bashbash のの traptrap
● シェルの組み込みなので機能に差がある
– bash の trap(1) はハンドラの一覧表示ができる
trap -p
シグナル 14
シグナルの送信シグナルの送信
●
kill(1) コマンド
kill [-s シグナル名 ][- 番号 ] PID[ …PID]
シグナル 15
シグナルの種類(再訪)シグナルの種類(再訪)
● 代表的なシグナル
– SIGILL不正命令 不正な命令の実行 4
– SIGBUS バスエラー 不正メモリ操作 7
– SIGFPE 浮動小数点例外 ゼロ除算など 8
– SIGSEGV セグメンテーション違反 不正メモリアクセス 11
– SIGPIPE パイプ書き込みエラー 相手がいないパイプ 13
– SIGUSR1 ユーザー定義シグナル 10
– SIGUSR2 ユーザー定義シグナル 11
シグナル 16
シグナルの用途シグナルの用途
● SIGHUP
設定の読み込みやログの再オープン処理など
● SIGCHLD
無視する事で子プロセスのゾンビ化を防止
● SIGUSR1
GNU dd(1) では進捗状況を表示
シグナル 17
特権的なシグナル特権的なシグナル
● 殆どのシグナルはプロセスが挙動を決められる
– 無視、特別な処理、デフォルトの挙動
● 例外的に挙動を決められないシグナル
– SIGKILL プロセスの強制終了。シグナル番号は 9 。
kill(1) コマンドで発生
– SIGSTOP 実行中断。シグナル番号は 19 。
端末から中断キー (Ctrl+Z) で発生
シグナル 18
緊急時に便利なシグナル緊急時に便利なシグナル
● 緊急時には Ctrl+Z が有効
trap '' 1 2 3 15
:
rm -rf *
●
kill -9 するためには pid を調べる必要がある(時間がかかる)
● 端末から Ctrl+Z すれば取りあえず停止する
シグナル 19
余談(1)余談(1)
● 初期のシグナル (SYSV シグナル ) は牧歌的
– システムコールの実行中のシグナル
停止してエラーリターンする
– ハンドラ実行中のハンドラは
実行されない様にする(デフォルトに戻る)
シグナル 20
余談(2)余談(2)
● 中期のシグナル (BSD シグナル ) は少し頑張った
– システムコールの実行中のシグナル
ハンドラを実行した後はシステムコールに戻る
– ハンドラ実行中のハンドラは
保留(ブロック)されてハンドラ終了後に届く
シグナル 21
余談(3)余談(3)
● 後期のシグナルは論理的(当社比)
– システムコールの名前を変える
signal(2) は sigaction(2) に
– ハンドラ実行中のハンドラは
シグナルマスクの概念を作って選択可能とした

More Related Content

シク?ナル