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 シグナルが捕捉され、シグナル ハンドラが戻らない場合を除き、プロセスが異常終了します。