_4標準ライブラリ関数

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;
}

おすすめ

転載: www.cnblogs.com/chay/p/11521408.html