GNU/Linux >> Linux の 問題 >  >> Linux

従来の Linux fork-exec での _exit() と exit() の使用の違いは何ですか?

_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() を使用することをお勧めします。


    Linux
    1. Linuxコンテナとイメージの違いは何ですか?

    2. Linuxのlocateコマンドとfindコマンドの違いは何ですか

    3. Linuxカーネルモジュールのmodule_initとinit_moduleの違いは何ですか?

    1. Linuxのバッファメモリとキャッシュメモリの違いは何ですか?

    2. `sh` と `source` の使用の違いは何ですか?

    3. Linux プラットフォーム ドライバーと通常のデバイス ドライバーの違いは何ですか?

    1. Linux でのライブラリ呼び出しとシステム呼び出しの違いは何ですか?

    2. Linux の「fallocate --dig-holes」と「fallocate --punch-hole」の違いは何ですか?

    3. 「hier(7)」と「file-hierarchy(7)」の man ページの違いは何ですか?