Mad*_*Ram 24 file-descriptors fork files
当一个孩子被分叉时,它继承了父母的文件描述符,如果孩子关闭文件描述符会发生什么?如果孩子开始写,在父母结束时文件会发生什么?谁来管理这些不一致,内核还是用户?
当进程调用该close
函数以通过文件描述符关闭特定打开的文件时。在进程的文件表中,引用计数减一。但是由于父子进程都持有同一个文件,引用计数是 2,关闭后它减少到 1。由于它不是零,进程仍然继续使用文件,没有任何问题。
请参阅 Terrence Chan UNIX 系统编程,(文件的 Unix 内核支持)。
gol*_*cks 38
当一个孩子被分叉时,它继承了父母的文件描述符,如果孩子关闭文件描述符会发生什么?
它继承了文件描述符的副本。因此关闭子进程中的描述符将为子进程关闭它,但不会为父进程关闭它,反之亦然。
如果孩子开始写,在父母结束时文件会发生什么?谁来管理这些不一致,内核还是用户?
它与写入同一个文件的两个进程完全相同(就像在字面上一样)。内核独立调度进程,因此您可能会在文件中获得交错数据。
然而,POSIX(*nix 系统很大程度上或完全符合)规定C API 中的函数read()
和write()
函数(映射到系统调用)是“相对于彼此的原子 [...]符号链接”。GNU C 手动也临时承诺了关于管道的这一点(请注意PIPE_BUF
,作为附带条件的一部分,默认值为 64 kiB)。这意味着其他语言/工具中的调用,例如echo
or 的使用cat
,应该包含在该合约中,所以如果两个独立的进程尝试将“hello”和“world”同时写入同一个管道,另一个会出现什么end 要么是“helloworld”要么是“worldhello”,永远不会像“
当进程调用 close 函数通过文件描述符关闭特定打开的文件时。进程的文件表将引用计数减一。但是由于父子进程都持有同一个文件(引用计数为 2,关闭后它会减少)到 1) 因为它不是零所以进程仍然继续使用文件没有任何问题。
有两个进程,父进程和子进程。它们没有共同的“引用计数”。他们是独立的。WRT 当其中一个关闭文件描述符时会发生什么,请参阅第一个问题的答案。