fork后,我们会调用exec执行另一个程序,此时会用全新的程序替换子进程的正文,数据,堆和栈,那这样的话子进程的文件描述符表所占的内存也自动释放了吧,为什么还会存在是否要关闭子进程的文件描述符一说?
难道不关闭子进程的文件描述符,exec新的程序还能使用?新的程序好比是一个新的进程,而文件描述符是进程之间独立的,所以这不合乎逻辑啊?求大神解惑
认证0级讲师
是的,子進程的檔案描述子確實已經釋放了,但是關閉檔案描述子最大的原因是因為緩衝機制的存在,如果不關閉就會導致資料不完整寫入。當然,還有一些原因。 exec 函數後可以認為是新的進程,除了進程標識符以外都是新的,文件描述符是進程維護的,但是進程描述符說穿了只是一個類似指針一樣的東西,它真正指向的是內核維護的文件表,只回收了文件描述符,不回收文件表項就跟記憶體洩漏一個道理。
請參考 close_on_exec
如你所言, 子程序不關閉檔案描述子的話, exec後確實是還可以使用的,比如說0,1,2
是的,子進程的檔案描述子確實已經釋放了,但是關閉檔案描述子最大的原因是因為緩衝機制的存在,如果不關閉就會導致資料不完整寫入。當然,還有一些原因。 exec 函數後可以認為是新的進程,除了進程標識符以外都是新的,文件描述符是進程維護的,但是進程描述符說穿了只是一個類似指針一樣的東西,它真正指向的是內核維護的文件表,只回收了文件描述符,不回收文件表項就跟記憶體洩漏一個道理。
請參考 close_on_exec
如你所言, 子程序不關閉檔案描述子的話, exec後確實是還可以使用的,比如說0,1,2