信号のabort関数
5113 ワード
abort関数の機能は異常プログラムを終了させることです.
この関数は呼び出しプロセスにSIGABRT信号を送信する(プロセスはこの信号を無視すべきではない).ISO Cは、呼び出しabortがホスト環境にraise(SIGABRT)関数を呼び出すことによって、失敗した終了通知を送信することを規定している.
≪インスタンス|Instance|emdw≫
プログラムリスト10-18 abortのPOSIX.1実装
まずデフォルトの動作を実行するかどうかを確認し、もしそうであれば洗浄するので標準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/参照.
#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/参照.