![分叉的子进程是否总是会获得与父进程的文件 ID 相同的文件 ID?](https://linux22.com/image/143337/%E5%88%86%E5%8F%89%E7%9A%84%E5%AD%90%E8%BF%9B%E7%A8%8B%E6%98%AF%E5%90%A6%E6%80%BB%E6%98%AF%E4%BC%9A%E8%8E%B7%E5%BE%97%E4%B8%8E%E7%88%B6%E8%BF%9B%E7%A8%8B%E7%9A%84%E6%96%87%E4%BB%B6%20ID%20%E7%9B%B8%E5%90%8C%E7%9A%84%E6%96%87%E4%BB%B6%20ID%EF%BC%9F.png)
这可能是一个天真的问题,但在父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 的描述)。