分叉的子进程是否总是会获得与父进程的文件 ID 相同的文件 ID?

分叉的子进程是否总是会获得与父进程的文件 ID 相同的文件 ID?

这可能是一个天真的问题,但在父open调用中给我返回了 File ID 4

是否保证子进程会总是4还获得文件 ID吗?

答案1

成功的open调用将返回最小的数字作为尚未使用的文件描述符。

因此,如果open返回 4,则意味着文件描述符 0-3 已在使用中。由于 afork向子进程提供相同的文件描述符,因此子进程也会有 fd 0-3 正在使用,而 fd 4 空闲,因此open紧随 a 之后的父进程和子进程中的两次成功调用fork将返回相同的数字。但如果父母或孩子在 后打开或关闭了文件fork,则数字可能会有所不同。

一般来说,您不应该依赖于预测open调用的 fd,除非您有充分的理由并且非常确定您可以正确预测它。

答案2

是的,全部打开当您分叉时,文件 ID 会复制到子级。

人叉

子进程继承父进程的打开文件描述符集的副本。子级中的每个文件描述符都引用与父级中相应的文件描述符相同的打开文件描述(请参阅 open(2))。这意味着两个描述符共享打开文件状态标志、当前文件偏移量和信号驱动的 I/O 属性(请参阅 fcntl(2) 中 F_SETOWN 和 F_SETSIG 的描述)。

相关内容