父/子进程关闭文件描述符

7
如果您在父进程上执行fork()并创建一个子进程,然后子进程关闭从fork(父进程)继承的fd(文件描述符),那么文件是否会在父进程中保持打开状态,因为它们是独立的?标准输入/输出或错误呢?
1个回答

5
无论文件描述符代表文件还是设备,以及是否曾被传递为标准的 I/O 描述符给任何进程:如果在一个进程中关闭它,另一个进程仍然拥有有效的描述符。
(这很自然。想象一下,如果描述符与另一个进程中的描述符相互依赖。那么,如果子进程意外崩溃,父进程甚至无法记录此事实,一旦检测到崩溃。它无法通过任何先前打开的描述符记录此事实,因为所有形式的进程退出都涉及关闭所有打开的描述符。因此,故障模式往往会在进程之间传播。此外,即使是通过这些假设共享描述符的常规、无错误的 I/O 模式也会大量存在竞态条件。)

如果它们是独立的,孩子如何读取父母所写的内容? - Filipe
@Filipe - 它们是独立打开和独立访问的描述符,用于同一文件或设备。或者用于同一管道的一端或另一端,如果这是您所想的;但管道是特殊的,因为它们不存在于其描述符之外。 - Jirka Hanika
1
@Filipe - 是的,那很相似。但并不是完美的比喻。如果你有访问权限,并不意味着你现在正在积极打开文件。这只是意味着当你尝试打开它时,你将能够打开它。分叉进程就像现在已经打开文件的用户。 - Jirka Hanika
1
@GuyAvraham - 是的,每个进程可以在它知道再也不需要该资源时关闭任何资源。然而,通常习惯上会保留描述符,例如stdin、stdout和stderr,直到子进程终止,这将隐式地关闭它们所有。 - Jirka Hanika
1
@GuyAvraham - 是的,每个进程都可以在它确定不再需要某个资源时关闭它。然而,通常习惯上会保持诸如stdin、stdout、stderr等描述符打开,直到子进程终止,这样会隐式关闭所有这些描述符。 - Jirka Hanika
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接