信号のabort関数

5113 ワード

abort関数の機能は異常プログラムを終了させることです.
#include <stdlib.h>

void abort(void);

      

この関数は呼び出しプロセスにSIGABRT信号を送信する(プロセスはこの信号を無視すべきではない).ISO Cは、呼び出しabortがホスト環境にraise(SIGABRT)関数を呼び出すことによって、失敗した終了通知を送信することを規定している.
≪インスタンス|Instance|emdw≫
プログラムリスト10-18 abortのPOSIX.1実装
#include <signal.h>

#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>



void

abort(void)    /* POSIX-style abort() function */

{

    sigset_t        mask;

    struct sigaction    action;

    

    /*

    * Caller can't ignore SIGABRT, if so reset to default.

    */

    sigaction(SIGABRT, NULL, &action);

    if(action.sa_handler == SIG_IGN)

    {

        action.sa_handler = SIG_DFL;

        sigaction(SIGABRT, &action, NULL);

    }

    if(action.sa_handler == SIG_DFL)

        fflush(NULL);        /* flush all open stdio streams */



    /*

    * Caller can't block SIGABRT; make sure it's unblocked.

    */

    sigfillset(&mask);

    sigdelset(&mask, SIGABRT);    /* mask has only SIGABRT turned off */

    sigprogmask(SIG_SETMASK, &mask, NULL);

    kill(getpid(), SIGABRT);    /* send the signal */



    /*

    * If we're here, process caught SIGABRT and returned.

    */

    fflush(NULL);            /* flush all open stdio streams. */

    action.sa_handler = SIG_DFL;

    sigaction(SIGABRT, &action, NULL);    /* reset to default */

    sigprocmask(SIG_SETMASK, &mask, NULL)    /* just in case ... */

    kill(getpid(), SIGABRT);        /* and one more time */

    exit(1);    /* this should never be executed ... */

}

まずデフォルトの動作を実行するかどうかを確認し、もしそうであれば洗浄するので標準I/Oストリームです.これは、開いているすべてのストリームに対してfcloseを呼び出すことに等しくありません.(フラッシングのみのため、シャットダウンはしません)が、プロセスが終了すると、開いているすべてのファイルがシャットダウンされます.プロセスがこの信号をキャプチャして戻ってくると、プロセスがより多くの出力を生成する可能性があるため、すべてのストリームをもう一度フラッシングします.フラッシングを行わない唯一の条件は、プロセスがこの信号をキャプチャした後に_exitまたは_Exitを呼び出すことです.この場合の下で、メモリ内の洗浄されていない標準I/Oバッファはすべて破棄されます.
killを呼び出して呼び出し者に信号を生成すると、そして、この信号がブロックされていない場合(プログラムリスト10−18はそれを保証する)、killが戻る前に、その信号(または、ある未決、ブロックされていない信号)がプロセスに送信される(http://www.cnblogs.com/nufangrensheng/p/3514817.html).SIGABRT以外のすべての信号をブロックし、killの呼び出しが返されると、変更プロセスは必ず信号を捉え、信号処理プログラムからも返されることが分かる.
 
このブログの内容は『UNIX環境高度プログラミング』(第2版)から抜粋し、個人学習記録としてのみ使用されている.本書についてはhttp://www.apuebook.com/参照.