fork后,我们会调用exec执行另一个程序,此时会用全新的程序替换子进程的正文,数据,堆和栈,那这样的话子进程的文件描述符表所占的内存也自动释放了吧,为什么还会存在是否要关闭子进程的文件描述符一说?
难道不关闭子进程的文件描述符,exec新的程序还能使用?新的程序好比是一个新的进程,而文件描述符是进程之间独立的,所以这不合乎逻辑啊?求大神解惑
阿神2017-04-17 15:37:26
はい、子プロセスのファイル記述子は確かに解放されていますが、ファイル記述子を閉じる最大の理由は、バッファリング機構が存在するためです。閉じないと不完全なデータが書き込まれることになります。もちろん、他にも理由はあります。 exec 関数の後は、プロセス識別子を除いてすべてが新しいプロセスであると考えることができますが、プロセス記述子は実際に指すものにすぎません。ファイル テーブルはファイル記述子のみをリサイクルします。ファイル テーブル エントリのリサイクルに失敗すると、メモリ リークと同じになります。
PHPz2017-04-17 15:37:26
close_on_exec を参照してください
あなたが言ったように、子プロセスがファイル記述子を閉じない場合、0、1、2などのファイル記述子は実行後も使用できます