84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
fork后,我们会调用exec执行另一个程序,此时会用全新的程序替换子进程的正文,数据,堆和栈,那这样的话子进程的文件描述符表所占的内存也自动释放了吧,为什么还会存在是否要关闭子进程的文件描述符一说?
难道不关闭子进程的文件描述符,exec新的程序还能使用?新的程序好比是一个新的进程,而文件描述符是进程之间独立的,所以这不合乎逻辑啊?求大神解惑
认证0级讲师
是的,子进程的文件描述符确实已经释放了,但是关闭文件描述符最大的原因是因为缓冲机制的存在,如果不关闭就会导致数据不完整写入。当然,还有一些原因。exec 函数后可以认为是一个新的进程,除了进程标识符以外都是新的,文件描述符是进程维护的,但是进程描述符说穿了只是一个类似指针一样的东西,它真正指向的是内核维护的文件表,只回收了文件描述符,不回收文件表项就跟内存泄漏一个道理。
请参考 close_on_exec
正如你所言, 子进程不关闭文件描述符的话, exec后确实是还可以使用的,比如说0,1,2
是的,子进程的文件描述符确实已经释放了,但是关闭文件描述符最大的原因是因为缓冲机制的存在,如果不关闭就会导致数据不完整写入。当然,还有一些原因。exec 函数后可以认为是一个新的进程,除了进程标识符以外都是新的,文件描述符是进程维护的,但是进程描述符说穿了只是一个类似指针一样的东西,它真正指向的是内核维护的文件表,只回收了文件描述符,不回收文件表项就跟内存泄漏一个道理。
请参考 close_on_exec
正如你所言, 子进程不关闭文件描述符的话, exec后确实是还可以使用的,比如说0,1,2