質問: vforkまたはforkの子がexit()ではなく_exit()を呼び出す必要があるのはなぜですか? vfork()のmanページから: vfork()は、子がexecve(2)または_exit(2)を呼び出すまで親が一時停止されるという点で、fork()とは異なります。子は、execve()が子によって発行されるまで、スタックを含むすべてのメモリを親と共有します。子は現在の関数から戻ったり、exit()を呼び出したりしてはなりませんが、_exit()を呼び出すことはできます。 なぜ子供は単に_exit()を呼び出すのではなく、exit()を使用する必要があるのですか?これがvfork()とfork()の両方に当てはまることを願っています。
回答: 前に見た のように、vforkは、子プロセスが親のメモリにアクセスすることを許可しません。 exit はcライブラリ関数です(そのため、 多くの場合 as exit(3))。 cストリーム(_stdio.h_で宣言された関数を介して開かれるファイル)のフラッシュとクローズ、atexitに登録されたユーザー指定関数の実行などのさまざまなクリーンアップタスクを実行します。これらすべてのタスクには、プロセスメモリの読み取りと書き込みが含まれます。 __exit_ クリーンアップせずに終了します。これは直接システムコールであり(これが_exit(2)として記述される理由です)、通常はシステムコール番号をプロセッサレジスタに配置し、特定のプロセッサ命令を実行することによって実装されます(システムコールハンドラに分岐します)。これはプロセスメモリにアクセスする必要がないため、vforkの後に安全にアクセスできます。fork以降は、そのような制限はありません。親プロセスと子プロセスは完全に自律的になりました。