C 標準ライブラリでは、シグナル処理はプログラムが実行中にさまざまなシグナルを処理する方法を定義します。シグナルは、プログラム内の例外的な動作 (ゼロ除算など) を報告したり、プログラム外部の非同期イベント (キーボードで インタラクティブ アテンション キーを押すなど) を報告したりできます。
標準信号
C標準では6つのシグナルのみが定義されています。それらはすべてsignal.hヘッダー(C++csignalではヘッダー)で定義されています。[1]
SIGABRT– 「abort」、異常終了。SIGFPE–浮動小数点例外。SIGILL– 「違法」、無効な命令。SIGINT– 「割り込み」、プログラムに送信される対話型アテンション要求。SIGSEGV– 「セグメンテーション違反」、無効なメモリアクセス。SIGTERM– 「終了」、プログラムに送信される終了要求。
追加のシグナルは実装によってヘッダーで指定されることがありますsignal.h。例えば、UnixやUnix系オペレーティングシステム( Linuxなど)では15以上の追加シグナルが定義されています。Unixシグナルを参照してください。[2]
デバッグ
SIGTRAPデバッグ目的です。プラットフォームに依存しており、Unix系オペレーティング システムで使用できます。
取り扱い
raise()シグナルは、またはシステム コールを呼び出すことによって生成できますkill()。raise()現在のプロセスにシグナルを送信し、kill()特定のプロセスにシグナルを送信します。
シグナル ハンドラは、対応するシグナルが発生したときにターゲット環境によって呼び出される関数longjmp()です。 ターゲット環境は、シグナル ハンドラが戻るか呼び出すまでプログラムの実行を中断します。
signal()シグナルハンドラはまたはで設定できますsigaction()。 の動作はsignal()これまで何度も変更されており、使用は推奨されません。[3]シグナルの処理を SIG_DFL または SIG_IGN に設定する場合にのみ移植可能です。シグナルハンドラは、2 つのシグナルを除くすべてのシグナルに対して指定できます ( SIGKILLとSIGSTOP はキャッチ、ブロック、または無視できません)。
シグナルがプログラム内でエラーを報告した場合(シグナルが非同期でない場合)、シグナル ハンドラーはabort()、、、exit()またはを呼び出すことによって終了できますlongjmp()。
機能
使用例
#include <signal.h> #include <stdio.h> #include <stdlib.h>
揮発性sig_atomic_tステータス= 0 ;
静的void catch_function ( int signo ) { status = signo ; }
int main ( void ) { // 上記の関数を SIGINT シグナルのシグナル ハンドラーとして設定します: if ( signal ( SIGINT , catch_function ) == SIG_ERR ) { fputs ( "シグナル ハンドラーの設定中にエラーが発生しました。\n " , stderr ); return EXIT_FAILURE ; } puts ( "対話型注意シグナルを発生させています。" ); if ( raise ( SIGINT )) { fputs ( "シグナルの発生中にエラーが発生しました。\n " , stderr ); return EXIT_FAILURE ; } if ( status == SIGINT ) puts ( "対話型注意シグナルをキャッチしました。" ); puts ( "終了します。" ); return EXIT_SUCCESS ; // シグナルを発生させた後に終了します}
参照
参考文献
- ^ ISO/IEC 9899:1999 仕様(PDF) . p. 258、§ 7.14信号処理.
- ^ 「The Open Group Base Specifications Issue 6 – signal.h – シグナル」 。2012年1 月 10 日閲覧。
- ^ https://man7.org/linux/man-pages/man2/signal.2.html Signal(2) マニュアルページ
