標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
ISO C |
両方 |
#include <stdlib.h>
__noreturn__ void abort(void);
プログラム異常終了を起こし、ホスト環境に制御を戻します。abort() 関数は、バッファーのすべてをフラッシュし、オープン・ファイルをすべてクローズします。 異常終了では、atexit() リスト関数は 実行されない ので注意してください。
abort() 関数が呼び出されたときに、SIGABRT 用のハンドラーがユーザーにあれば、SIGABRT が上がります。ただし、デフォルト・アクションに関連したハンドラーが戻るときに SIGABRT が再び上がります。ユーザーのハンドラーがリセットされた場合でも、コード・パスはそのハンドラーを一度パススルーするだけです。同じことが SIGABRT が無視された場合に起こります。つまり、異常終了が起こります。
SIGABRT がシグナル・ハンドラーにキャッチされ、さらにシグナル・ハンドラーが戻らない場合、abort() 関数によるプログラム終了処理 は行われません。setjmp() および longjmp() でハンドラーから「ジャンプ」する ことにより、戻らないようにすることができます。z/OS® XL C プログラムでは、sigsetjmp() および siglongjmp() でハンドラー からジャンプできます。
詳しくは、 「z/OS XL C/C++ プログラミング・ガイド」の『ランタイム・ユーザー出口の使用』の トピックにあるプロセス終了の 情報を参照してください。
POSIX C の特殊な動作: abort() に関する POSIX の特殊な動作へのアクセスを取得する には、POSIX ランタイム・オプションを ON に設定する必要があります。
pthread_kill() を使用して、abort() を呼び出すと、SIGABRT シグナルが 上がり、その結果、そのシグナルは同じスレッドに向けられます。abort() により生成された SIGABRT シグナルをブロックすることは できません。
POSIX では、sigsetjmp() が以前に発行されたコード内の 場所で、ハンドラーは、siglongjmp() を使用して環境を復元できます。このようにして、アプリケーションは終了プロセスを 避けることができます。
C++ の特殊な動作: abort() が z/OS XL C++ プログラム から呼び出されると、そのプログラムは、現行ブロックを残さずに即時に終了 します。 atexit() に渡される関数と、静的およびローカル (自動) オブジェクト用 のデストラクターは呼び出されません。
デフォルト では、z/OS XL C++ 関数 の terminate() が abort() を呼び出します。
z/OS の異常終了戻りコードは 2000 です。
⁄* CELEBA01
This example tests for successful opening of the file myfile.
If an error occurs, an error message is printed and the program
ends with a call to the abort() function.
*⁄
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *stream;
unlink("myfile.dat");
if ((stream = fopen("myfile.dat", "r")) == NULL)
{
printf("Could not open data file¥n");
abort();
printf("Should not see this message¥n");
}
}