シグナル.h

導入

signal.h は、シグナル (つまり、例外) を処理するためのツールを提供します。いわゆる「シグナル」は、システムとプログラム間の短いメッセージとして理解でき、主に実行時エラーや異常イベントを示すために使用されます。

ヘッダー ファイル「signal.h」は、さまざまな信号を表す一連のマクロを定義します。

  • SIGABRT: 異常な中止 (おそらく abort() メソッドの呼び出しが原因)。
  • SIGFPE: 算術エラーが発生しました (おそらく 0 による除算またはオーバーフロー)。
  • SIGILL: 無効なコマンドです。
  • SIGINT: 中断します。
  • SIGSEGV: 無効なメモリ アクセス。
  • SIGTERM: リクエストを終了します。

上記の各マクロの値は、正の整定数です。

シグナル()

ヘッダー ファイル signal.h は、特定の信号処理関数を指定するために使用される signal() 関数も定義します。

シグナル(SIGINT、ハンドラー);

signal() は 2 つのパラメータを受け取ります。最初のパラメータは特定のシグナルのマクロであり、2 番目のパラメータはこのシグナルを処理する関数ポインタ handler です。

信号処理関数 'handler' は、信号のタイプを示す int 型のパラメーターを受け取ります。そのプロトタイプは次のとおりです。

void (*func)(int);

複数の信号が同じ処理関数を共有できるため、「handler」関数の本体はこの整数に基づいてどの信号が受信されたかを判断できます。ハンドラー関数が実行されると、プログラムはシグナルが発生した時点から実行を再開します。ただし、SIGABRT 信号が発生し、処理機能が完了すると、システムはプログラムを終了します。

システムがプログラムにシグナルを送信する場合、プログラムはシグナルを無視できます。つまり、ハンドラー関数を指定できません。

signal() の戻り値は前の処理関数へのポインタであり、新しい処理関数が実行されると、前の処理関数が復元されることがよくあります。

void (*orig_handler)(int);
orig_handler = signal(SIGINT, ハンドラー);
// SIGINT 信号発生後
signal(SIGINT, orig_handler);

上記の例では、signal() はシグナル SIGINT に対する新しいハンドラー関数 handler を指定し、元のハンドラー関数を変数 orig_handler に保存します。 handler関数が使用されるまで待ってから、元の処理関数に戻してください。

信号関連のマクロ

「signal.h」はシグナル関連のマクロも提供します。

(1) SIG_DFL

SIG_DFL はデフォルトの処理関数を表します。

シグナル(SIGINT、SIG_DFL);

上記の例では、SIGINT ハンドラーがデフォルトのハンドラーであり、現在の実装によって決定されます。

(2) SIG_IGN

SIG_IGN は信号を無視することを意味します。

シグナル(SIGINT, SIG_IGN);

上の例は、SIGINT 信号が処理されないことを示しています。プログラムの実行中に Ctrl + c を押すと SIGINT シグナルが発行されるため、このステートメントの使用後に Ctrl + c でプログラムを終了することはできません。

(3) SIG_ERR

SIG_ERR は、信号処理関数でエラーが発生した場合の signal() の戻り値です。

if (信号(SIGINT, ハンドラー) == SIG_ERR) {
  perror("signal(SIGINT, handler) が失敗しました");
  // ...
}

上記の例では、「handler」が SIGINT を処理するときにエラーが発生するかどうかを判断できます。

上げる()

raise() 関数は、プログラム内でシグナルを送信するために使用されます。

int raise(int sig);

信号値をパラメータとして受け入れ、信号が発信されたことを示します。戻り値は整数で、信号が正常に送信されたかどうかを判断するために使用できます。0 は成功を意味し、0 以外は失敗を意味します。

void ハンドラー(int sig) {
  printf("シグナル %d に対してハンドラーが呼び出されました\n", sig);
}

シグナル(SIGINT、ハンドラー);
raise(SIGINT);

上の例では、raise() が SIGINT シグナルをトリガーし、ハンドラー関数が実行されます。


作者: wangdoc

アドレス: https://wangdoc.com/

ライセンス: クリエイティブ・コモンズ 3.0