_exit
を使用する必要があります (またはその同義語 _Exit
) exec
のときに子プログラムを中止します この状況では、子プロセスが atexit
を呼び出して、親プロセスの外部データ (ファイル) に干渉する可能性があるため、失敗します。 ハンドラー、そのシグナル ハンドラーの呼び出し、および/またはバッファーのフラッシュ。
同じ理由で、 _exit
も使用する必要があります exec
を実行しない子プロセスで 、しかしそれらはまれです。
それ以外の場合はすべて exit
を使用してください .あなたが部分的に指摘したように、すべて Unix/Linux でのプロセス (1 つの init
を除く) ) は別のプロセスの子であるため、 _exit
を使用します すべての子プロセスで exit
を意味します init
の外では役に立たない .
switch (fork()) {
case 0:
// we're the child
execlp("some", "program", NULL);
_exit(1); // <-- HERE
case -1:
// error, no fork done ...
default:
// we're the parent ...
}
exit()
io バッファをフラッシュし、atexit()
によって登録された関数を実行するなどの他のことを行います . exit()
_end( )
を呼び出す
_exit()
それをせずにプロセスを終了するだけです。 _exit()
を呼び出します たとえば、デーモンを作成するときに親プロセスから。
main()
に気づいたことはありませんか 関数ですか?そもそもそれを何と呼んだのか不思議に思ったことはありませんか?C プログラムが実行中のシェルを実行すると、'exec' システム コールへの実行可能パスが提供され、制御がカーネルに渡され、カーネルはすべての実行可能 _start()
、あなたの main()
を呼び出します 、 main()
の場合 それを返し、_end()
を呼び出します C の一部の実装では、_end()
にわずかに異なる名前を使用しています。 &_start()
...
exit()
と _exit()
_end()
を呼び出す
通常 - main()
ごとに exit()
は 1 つだけである必要があります 電話。 (または main()
の最後で戻ります )
exit() は _exit() の上にあり、従来の C ライブラリを使用します。
違いがあります:
<オール>_exit() は stdio バッファーをフラッシュしませんが、exit() は終了前に stdio バッファーをフラッシュします。
_exit() はクリーンアップ プロセスを実行できませんが、exit() は何らかの関数 (つまり、on_exit または at_exit) に登録して、プログラムを存在させる前に何かが必要な場合にクリーンアップ プロセスを実行できます。
exit(status) は単に終了ステータスを _exit(status) に渡します。子と親の間で fork() を実行するときはいつでも、1 つは _exit() を使用し、もう 1 つは exit() を使用することをお勧めします。