こんにちは。
最近、ふつうのLinuxプログラミング 第2版を読んでいるので知識の定着のために学んだ内容を要約したメモを書きます。
このエントリは完全な個人のメモです。
お勉強のためにこの本を読んでいるので、内容を覚えるためにSummarizing(サマライジング)を行います。
12章の内容はこちら。
シグナルに関わるAPI
この章で説明すること
シグナルの概念やプログラムでの補足のしかた、送信の仕方を説明します。
シグナルとは
ユーザーやカーネルが、プロセスに対して何かを通知するための機能です。
シグナルにはSIGINTやSIGHUP、SIGKILLなどがあります。
SIGKILL以外のシグナルはプログラムで補足可能です。
sigaction(2)を使えばシグナルを補足したときの動作を変更することができる。
コアダンプ
SIGSEGV、SIGBUS、SIGFPEが補足されたときのデフォルト動作はコアダンプしてプログラムを終了します。
コアダンプとはメモリダンプのこと。
昔はメモリに磁気コアというものを使っていたらしいのでその名残らしいです。
signal(2)
シグナルを補足するシステムコール。
ハンドラの再設定やシステムコールの再起動、リエントラントではない関数の呼び出し、シグナルのブロックなど多くの問題があるので非推奨。
sigaction(2)
signal(2)はあまりにも使い勝手が悪いので基本はこちらを使用する。
signal(2)の問題の多くが考慮されたシステムコール。
関数ポインタ
シグナルハンドラの説明のために関数ポインタの説明もありました。
関数名で関数の先頭ポインタが取得できます。
sigset_t操作API
sigemptyset()などの簡単な紹介。
シグナルのブロック
シグナルのブロックはsigactionのsa_maskで行います。
シグナルの送信
プログラムからシグナルを送信するときにはkill(2)を使います。
Ctrl+Cでシグナルが送信される仕組みの説明
端末ドライバが中で色々頑張ってくれるらしい。
演習問題
SIGINTシグナルを受けたらメッセージを出力して終了するプログラムを書きなさい。シグナルを待つにはpause()というAPIが使えます。
作ったプログラムは以下。
実行結果は以下。
まとめ
13章の内容はこんな感じです。
14章の内容はこちら。
おわり。