Looking for c Answers? Try Ask4KnowledgeBase
Looking for c Keywords? Try Ask4Keywords

C Language信号処理


構文

  • void(* signal(int sig、void(* func)(int)))(int);

パラメーター

パラメータ詳細
sig シグナルハンドラをSIGABRTSIGFPESIGILLSIGTERMSIGINTSIGSEGVまたは何らかの実装定義値のいずれかに設定するSIGFPE
機能以下のいずれかであるシグナルハンドラ: SIG_DFL 、デフォルトのハンドラ用SIG_IGNシグナルを無視する、または署名付き関数ポインタvoid foo(int sig);

備考

C標準からの保証のみを伴うシグナルハンドラの使用は、ユーザ定義のシグナルハンドラで何ができるか、できないかを様々な制限を課す。

  • SIGSEGVSIGFPESIGILLまたは他のインプリメンテーション定義のハードウェア割り込みを処理しているときにユーザー定義関数が戻ると、その動作はC標準では定義されません。これは、Cのインタフェースが障害状態(例えば、 0除算した後)を変更する手段を与えないため、プログラムを返すときにハードウェア割り込みが発生する前とまったく同じエラー状態になるためです。

  • abort 、またはraise呼び出しの結果としてユーザー定義関数が呼び出された場合、シグナル・ハンドラーはraiseを再度呼び出すraiseはできません。

  • 信号はどんな動作の途中でも到達する可能性があるため、動作の不可分性は一般的に保証されず、信号処理も最適化でうまく機能しません。したがって、シグナルハンドラ内のデータに対するすべての変更は、変数

    • タイプsig_atomic_t (すべてのバージョン)またはロックフリーのアトミックタイプ(C11以降)
    • volatile修飾されたものです。
  • C標準ライブラリの他の関数は、プログラムのグローバルな状態で変数を変更する可能性があるため、通常はこれらの制限を守りません。 C標準はabort_Exit (C99以降)、 quick_exit (C11以降)、 signal (同じシグナル番号)、およびいくつかのアトミック操作(C11以降)のみを保証します。

上記の規則のいずれかに違反した場合、C標準によって動作が未定義になります。プラットフォームには特定の拡張機能が含まれている場合がありますが、一般的にそのプラットフォームを超えて移植することはできません。

  • 通常、システムは、シグナルハンドラから使用できるCライブラリ関数である非同期シグナルセーフである独自の関数リストを持っています。通常、 printfはこれらの機能の1つです。

  • 特に、Cの標準では、スレッドインタフェース(C11以降)やPOSIXスレッドなどのプラットフォーム固有のスレッドライブラリとのやりとりについてはあまり規定していません。そのようなプラットホームは、それ自体でシグナルとそのようなスレッドライブラリの相互作用を特定しなければならない。

信号処理 関連する例