signal.hに
ライブラリ変数
sig_atomic_t |
int型は、信号処理プログラムにおける変数として使用されます。これは、非同期信号が存在する場合でも、オブジェクトは、アトミックエンティティとしてアクセスすることができ、整数型のオブジェクトは、オブジェクトがアトミックエンティティとしてアクセスすることが可能です。 |
マクロライブラリ
SIG_DFL |
デフォルトのシグナルハンドラ。 |
SIG_ERR |
これは、信号エラーを表します。 |
SIG_IGN |
信号を無視します。 |
SIG
マクロ条件のチャンネル番号を表すために使用されます。
SIGABRT |
プログラムの異常終了。 |
SIGFPE |
このようなゼロによる除算やオーバーフローなどの算術演算エラー。 |
SEAL |
違法な機能画像など違法命令。 |
SIGINT |
例えば、CTRL-Cなどの割り込み信号、。 |
SIGSEGV |
このようなメモリセルへのアクセスなどの不正なメモリアクセスは、存在しません。 |
SIGTERM |
要求信号に送信本プログラムを終了します。 |
ライブラリ関数
void (*signal(int sig, void (*func)(int)))(int) |
この関数は、信号、すなわち、信号処理プログラムを処理する機能を設定します。 |
int型昇給(int型SIG) |
この関数は、シグナルsigを生成するためにつながります。sig引数は、SIGマクロと互換性があります。 |
void sighandler(int);
int main()
{
signal(SIGINT, sighandler);
printf("generate a signal\n");
raise(SIGINT);
printf("exit\n");
return(0);
}
void sighandler(int)
{
printf("get a signal\n");
}
SETJMP.H
setjmp
そしてlongjmp
関数は、同様の文を通信するためのメカニズムを提供するが、それは関数の範囲内に限定されるものではなく、これらの機能は、一般的に深くネストされた関数呼び出しチェーンに使用します。エラーが検出された場合、関数は先頭にすぐに返すことが、あなたは、呼び出し元の関数に関数の下層の各鎖の中間層をエラーフラグを返す必要はありません。
宣言するjmp_buf
変数と呼び出しsetjmp
、関数の初期化setjmp
関数が0を返し、setjmp
ステータス情報がプログラムされます(例えば、プログラム・カウンタ及びスタックポインタの現在位置)がジャンプバッファに格納され、呼び出すsetjmp
関数は時間となりますトップレベルの機能。その後、彼が呼ばれるコールし、トップレベルの機能やその他の機能(コールする直接または間接の呼び出し)にlongjmp
機能を、これは復元するために保存された状態につながります。longjmp
再びスルー実行の流れに影響setjmp
復帰機能は、それによって直ちに最上位関数に戻ってジャンプ。
setjmp
関数が呼び出される最初の時間は、それは0を返します。ときsetjmp
のように、longjmp
実行結果の時に再び戻って、彼は戻り値であり、longjmp
第二引数の、それはゼロ以外の値でなければなりません。彼の戻り値のチェックは、プログラムがコールするかどうかを判断することができますlongjmp
より多く存在し、あればlongjmp
これを判断することができますlongjmp
と呼ばれています。
ライブラリ変数
jmp_buf |
マクロsetjmp関数()と関数longjmp関数()配列型の関連情報を格納します。 |
マクロライブラリ
int型のsetjmp(のjmp_buf環境) |
longjmpの()後の使用を機能させるために環境に格納されている現在のマクロ環境変数。このマクロは、マクロ呼び出しから直接返す場合、それはゼロを返し、それはlongjmp関数()関数呼び出しから返された場合、それはゼロ以外の値を返します。 |
ライブラリ関数
空のlongjmp(のjmp_buf環境、int型の値) |
この機能は、最新のコールのsetjmp()、マクロ環境を保存するsetjmp関数を呼び出す前のjmp_bufによってパラメータを設定するを復元()生成されました。 |
#include <stdio.h>
#include <setjmp.h>
static jmp_buf buf;
void second(void) {
printf("second\n"); // 打印
longjmp(buf,1); // 跳回setjmp的调用处 - 使得setjmp返回值为1
}
void first(void) {
second();
printf("first\n"); // 不可能执行到此行
}
int main() {
if ( ! setjmp(buf) ) {
first(); // 进入此行前,setjmp返回0
} else { // 当longjmp跳转回,setjmp返回1,因此进入此行
printf("main\n"); // 打印
}
return 0;
}