C標準ライブラリ -<signal.h>
概要
<signal.h>C標準ライブラリ内のヘッダファイルで、シグナルを処理するために使用されます。
signal.hヘッダファイルは1つの変数型を定義し、sig_atomic_t2つの関数呼び出しといくつかのマクロで、プログラム実行中に報告されるさまざまなシグナルを処理します。
シグナルは非同期通知メカニズムであり、特定のイベントが発生したときにプロセスが事前定義された処理関数を実行できるようにします。
以下は、signal 関数を使用して SIGINT シグナル(通常は Ctrl+C によって生成されます)を捕捉する方法を示す簡単なサンプルプログラムです。
例
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
// プログラムが終了すべきかどうかを示すグローバル変数
volatile sig_atomic_t stop = 0;
void handle_sigint(int sig) {
printf("Caught signal %d\n", sig);
stop = 1; // 終了フラグを設定
}
int main() {
// SIGINT シグナルのハンドラを handle_sigint 関数に設定
signal(SIGINT, handle_sigint);
while (!stop) { // 終了すべきかどうかを確認
printf("Running...\n");
sleep(1);
}
printf("Exiting...\n");
return 0;
}
#include <signal.h>
#include <unistd.h>
// プログラムが終了すべきかどうかを示すグローバル変数
volatile sig_atomic_t stop = 0;
void handle_sigint(int sig) {
printf("Caught signal %d\n", sig);
stop = 1; // 終了フラグを設定
}
int main() {
// SIGINT シグナルのハンドラを handle_sigint 関数に設定
signal(SIGINT, handle_sigint);
while (!stop) { // 終了すべきかどうかを確認
printf("Running...\n");
sleep(1);
}
printf("Exiting...\n");
return 0;
}
上記のコードでは、プログラムの実行中にユーザーが押すとCtrl+C、SIGINT シグナルが捕捉され、handle_sigint 関数が呼び出され、シグナル番号が出力されます。
上記のコードをコンパイルして実行すると、出力結果は次のようになります:
Running... Running... Running... ^CCaught signal 2 Exiting...
コード解析:
volatile sig_atomic_t stop = 0;:グローバル変数を定義しますstop、プログラムが終了すべきかどうかを示すために使用されます。volatileキーワードを使用して、コンパイラがその変数へのアクセスを最適化しないことを保証します。シグナルハンドラ内で変更される可能性があるためです。sig_atomic_t型は、その変数へのアクセスがアトミックであることを保証します。- に
handle_sigintシグナル処理関数では、stopを1に設定して、プログラムが終了すべきことを示します。 - メインループでは、
stop変数の値を確認し、1に設定されている場合はループを抜けてプログラムを終了します。
ライブラリ変数
以下は、ヘッダファイル signal.h で定義されている変数型です:
| 番号 | 変数 & 説明 |
|---|---|
| 1 | sig_atomic_t これはint型で、シグナルハンドラ内で変数として使用されます。これはオブジェクトの整数型であり、非同期シグナルが存在する場合でも、そのオブジェクトはアトミックエンティティとしてアクセスできます。 |
| 2 | sigset_t シグナルセットを表すためのデータ型です。 |
ライブラリマクロ
<C標準ライブラリでは、SIG_接頭辞のマクロはsignal関数と一緒に使用され、シグナルの動作を定義および処理します。以下は一般的なSIG_マクロとその用途です:
| 番号 | マクロ & 説明 |
|---|---|
| 1 | SIG_DFL シグナルのデフォルトハンドラを表します。このマクロを使用すると、シグナルをデフォルトの動作に戻すことができます。 |
| 2 | SIG_ERR シグナル処理関数の設定が失敗したことを示す戻り値です。 |
| 3 | SIG_IGN シグナルを無視します。 |
シグナルの種類:
| 定数 | 説明 |
|---|---|
SIGABRT | 由 abort関数によって生成されるシグナルで、異常終了を表します。 |
SIGALRM | 由 alarm関数によって設定されたタイマー満了シグナル |
SIGBUS | 不正なメモリアクセス(例:アライメントされていないメモリアドレスへのアクセス) |
SIGCHLD | 子プロセスの状態変更(終了または停止) |
SIGCONT | 一時停止されたプロセスの実行を継続 |
SIGFPE | 算術エラー(例:ゼロ除算エラー、浮動小数点例外) |
SIGHUP | ハングアップシグナル(通常、端末の切断を検出するために使用されます) |
SIGILL | 不正な命令 |
SIGINT | 割り込みシグナル(通常は Ctrl+C によって生成されます) |
SIGKILL | 即時終了シグナル(捕捉または無視できません) |
SIGPIPE | 読み取りプロセスのないパイプへのデータ書き込み |
SIGQUIT | 端末終了シグナル(通常は Ctrl+\ によって生成されます)、コアダンプを生成します。 |
SIGSEGV | セグメンテーションフォルト(不正なメモリアクセス) |
SIGSTOP | プロセスの実行を停止します(捕捉または無視できません) |
SIGTERM | 終了シグナル |
SIGTSTP | プロセスを一時停止します(通常は Ctrl+Z によって生成されます) |
SIGTTIN | バックグラウンドプロセスが端末からデータを読み取るときに生成されるシグナル |
SIGTTOU | バックグラウンドプロセスが端末にデータを書き込むときに生成されるシグナル |
SIGUSR1 | ユーザー定義シグナル 1 |
SIGUSR2 | ユーザー定義シグナル 2 |
SIGPOLL | I/O イベント(SIGIO の代替) |
SIGPROF | タイマー満了シグナル(setitimerによって設定されるプロファイリングタイマー) |
SIGSYS | 不正なシステムコール |
SIGTRAP | ブレークポイントまたはトラップ命令 |
SIGURG | ソケットの緊急状態シグナル |
SIGVTALRM | 仮想クロックタイマー満了シグナル |
SIGXCPU | CPU 時間制限を超過 |
SIGXFSZ | ファイルサイズ制限を超過 |
ライブラリ関数
以下は、ヘッダファイル signal.h で定義されている関数です: