exit()
C と C++ では、との違いは何abort()
ですか? エラー (例外ではない) の後でプログラムを終了しようとしています。
5 に答える
abort()
firstを使用して登録された関数を呼び出さatexit()
ずに、またオブジェクトのデストラクタを最初に呼び出さずに、プログラムを終了します。exit()
プログラムを終了する前に両方を行います。ただし、自動オブジェクトのデストラクタは呼び出しません。そう
A a;
void test() {
static A b;
A c;
exit(0);
}
適切に破棄a
しb
ますが、 のデストラクタは呼び出しませんc
。abort()
どちらのオブジェクトのデストラクタも呼び出しません。残念なことに、C++ 標準では、適切な終了を保証する別のメカニズムについて説明しています。
main()
自動保存期間を持つオブジェクトは、関数が自動オブジェクトを含まず、 への呼び出しを実行するプログラムですべて破棄されexit()
ます。main()
で捕捉された例外をスローすることにより、制御をそのような に直接移すことができますmain()
。
struct exit_exception {
int c;
exit_exception(int c):c(c) { }
};
int main() {
try {
// put all code in here
} catch(exit_exception& e) {
exit(e.c);
}
}
を呼び出す代わりにexit()
、そのコードを配置しますthrow exit_exception(exit_code);
。
abortは SIGABRT シグナルを送信し、exitは通常のクリーンアップを実行しているアプリケーションを閉じるだけです。
アボート信号は好きなように処理できますが、デフォルトの動作では、アプリケーションもエラー コードで閉じられます。
abortは静的およびグローバル メンバーのオブジェクト破棄を実行しませんが、exitは実行します。
もちろん、アプリケーションが完全に閉じられると、オペレーティング システムは解放されていないメモリやその他のリソースを解放します。
アボートと終了プログラムの終了の両方で (デフォルトの動作をオーバーライドしていないと仮定して)、アプリケーションを開始した親プロセスに戻りコードが返されます。
次の例を参照してください。
SomeClassType someobject;
void myProgramIsTerminating1(void)
{
cout<<"exit function 1"<<endl;
}
void myProgramIsTerminating2(void)
{
cout<<"exit function 2"<<endl;
}
int main(int argc, char**argv)
{
atexit (myProgramIsTerminating1);
atexit (myProgramIsTerminating2);
//abort();
return 0;
}
コメント:
abortのコメントが外されている場合: 何も出力されず、someobject のデストラクタは呼び出されません。
上記のように中止がコメント化されている場合: someobject デストラクタが呼び出され、次の出力が得られます。
終了機能 2
終了機能 1
exit
プログラムが()を呼び出すと、次のことが起こります。
- 関数によって登録された
atexit
関数が実行されます - 開いているすべてのストリームがフラッシュされて閉じられ、によって作成されたファイル
tmpfile
が削除されます - プログラムは、ホストに指定された終了コードで終了します
( abort
) 関数SIGABRT
は現在のプロセスにシグナルを送信します。シグナルがキャッチされない場合、開いているストリームがフラッシュ/クローズされたり、作成された一時ファイルtmpfile
が削除されたり、atexit
登録された関数が呼び出されたり、非ゼロの終了ステータスがホストに返されます。
abort
信号を送りますSIGABRT
。 abort
呼び出し元には戻りません。シグナルのデフォルト ハンドラーはSIGABRT
、アプリケーションを閉じます。 stdio
ファイル ストリームはフラッシュされてから閉じられます。ただし、C++ クラス インスタンスのデストラクタはそうではありません (これについてはわかりません -- おそらく結果は未定義ですか?)。
exit
には独自のコールバックがあり、 で設定されatexit
ます。コールバックが指定されている (または 1 つだけ) 場合、それらは登録順序とは逆の順序で呼び出され (スタックのように)、プログラムは終了します。と同様にabort
、exit
呼び出し元には戻りません。 stdio
ファイル ストリームはフラッシュされてから閉じられます。また、C++ クラス インスタンスのデストラクタが呼び出されます。
exit() マニュアルページから:
exit() 関数はプロセスを正常に終了させ、status & 0377 の値を親に返します。
abort() マニュアルページから:
abort() は、最初に SIGABRT シグナルのブロックを解除し、次に呼び出しプロセスに対してそのシグナルを発生させます。これにより、SIGABRT シグナルが捕捉され、シグナル ハンドラが戻らない場合を除き、プロセスが異常終了します。