Linuxシステムコールの勉強(その3)

Linuxシステムコール

Linuxシステムコール

前回はこちら


今回からsignal(シグナル)についてまとめます。
シグナルとはプロセスに対して通知を行うための仕組みです。基本的にはlinux上のすべてのプロセスはシグナルを受け取った際にそのシグナルに応じた動作を行うようになっています。このシグナルに応じた動作を記した処理のことをSignal Handlerと呼びます。


★ シグナルが発生するケース

    • 割り込みキーをユーザが入力(Ctrl+c , Ctrl+z...)
    • killコマンドを実施
    • 参照出来ないメモリを参照した
    • 不正な演算を実施(0除算,オーバーフロー...)
    • 明示的にSignalを送信する処理を行った


あるプロセスから別のプロセスに対して通知を行うという動作は、Windows上のメッセージ通信と似ているなと感じました。シグナルにSignal Handlerといった処理を対応付けることと、Windowsにてwndproc()が受け取ったWindowsメッセージを解析してそれに応じた処理(Event Handler)を実施することは類似性を感じます。どちらもプロセス間通信と考えれば、似てて当然(というかたぶんWindows側が意識して実装したのでしょうが)といったところかも知れません。


上記のシグナルが発生するケースについてもう少し掘り下げてみます。


割り込みキーをユーザが入力
割り込みキーとはシグナルを発生させるキーです。Ctrlキーを押しながらcを押したり、zを押したりした場合に出ます。Ctrl+cはプロセスを止める時に使用します。Ctrl+zはプロセスを一時停止する場合に使用します。
Ctrl+cはプロセスを強制停止する時にしようするので、「死ね」とか「殺す」とかそういう物騒な言葉を呟きながら使ったりすると玄人っぽい気がします。


割り込みキーについて

シグナル番号 シグナル名 stty 割り込みキー
2 SIGINT intr Ctrl+c
2 SIGQUIT quit Ctrl+\
18 SIGCONT star Ctrl+q
19 SIGSTOP stop Ctrl+s
20 SIGTSTP susp Ctrl+z


ちなみにsttyとは割り込みキーの名称をあらわします。詳しくはman sttyとかsttyp -aを参照。


killコマンドを実施

kill プロセスID [Signalの種類]

とすることでプロセスIDで指定されるプロセスに対して、特定のシグナルを送信することが可能です。よく使うのは暴走したプロセスのIDを特定してkillで強制停止する場合。

itotto@itotto > kill -KILL 2000


これはプロセスID 2000に対してシグナル[KILL](9)が送られたことになります。仮に該当のプロセスが特別なSignal Handlerを実装していない場合にはプロセスID 2000は即時に処理を中止することになります。
ちなみに送信するプロセス番号が分からない場合にはkillに-lオプションを付けて実施してください。

itotto@itotto > kill -l

上記のとおり、シェル上にもシグナルを送信することが出来る機能があるので特別にプログラムを作成しなくても通常のシグナルは送れます。
次回からはプログラムを作成した時にその中で特定のシグナルに対してのSignal Handlerの割り当てる方法どを説明する。


次へ進む


(参考サイト)