在使用spawn()之后,使用_exit()或exit()?

4
正如维基百科这里所述:“当调用spawn时打开的文件会在子进程中保持打开状态”。(与exec()相似)
操作系统已经打开并准备好一些文件,供新生的不知情的进程使用。假设我们的进程不知道先前打开的文件,并最终决定终止;而像C这样的编程语言要求在终止之前进行一些内部进程清理。
我的问题是,这种清理是否会以任何方式影响那些已打开的文件? 据我所知,它们没有在进程本身内部的任何地方注册或记录。
答案应该在定义程序员终止spawn()进程(甚至是exec()进程)时的行为。完整的清理过程是否会以任何方式损害父进程?(例如删除临时文件),因此程序员是否应该使用_exit()而不是exit()
1个回答

3

简短回答: 不需要。C运行时不会在进程退出时关闭打开的文件句柄,因此您可以从父进程或子进程退出,而不必担心影响其他进程。

当没有对它的引用时,内核会负责关闭文件句柄,这种情况发生在内核销毁进程时。内核可以很好地处理这种情况。


@JSBangs:不是100%。那么临时文件呢?在程序终止时,它们可能会被删除,即使存在另一个进程正在对该文件进行IO操作。 - ned1986zha
@ned,tmpfile不是问题。在*nix系统上,可以写入已删除的文件--对已删除文件的句柄保持打开状态,并且直到关闭最后一个句柄才会删除文件的inode。在Windows上,无法删除具有打开句柄的文件,C库将通过将tmp句柄标记为子进程中的非临时或者在尝试关闭文件时忽略遇到的错误来处理此条件。 - JSBձոգչ
在*nix系统中,tmpfile会在打开文件时立即删除它。或者至少,我希望所有真实世界的实现都是这样做的。 - R.. GitHub STOP HELPING ICE
哇!这些答案都是正确的,但我认为我们忽略了最初的问题。如果我制作自己的操作系统,它的行为与*nix和Win不同,那么C标准是否应该涵盖它? - ned1986zha
@ned,你可以制作一个自己想要的CrazyOS。然后由实现你的操作系统的人来遵守C标准。 - JSBձոգչ
@JSBangs,CrazyOS,我喜欢那个:D。当然,这种方式实现的不是完全符合标准。标准严格规定文件应该被删除。 - ned1986zha

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