文件描述符和派生


9

当孩子被分叉时,它会继承父对象的文件描述符,如果孩子关闭了文件描述符,将会发生什么?如果孩子开始写文件,那么在父母的末端文件将如何处理?谁来管理这些不一致,内核还是用户?

当进程调用该close函数以通过文件描述符关闭特定打开的文件时。在进程的文件表中,引用计数减一。但是由于父级和子级都持有同一个文件,因此引用计数为2,关闭后该引用计数减少为1。由于它不是零,因此该进程仍然可以继续使用文件而没有任何问题。

请参阅Terrence Chan UNIX系统编程,(Unix内核对Files的支持)。


好吧,别提那最后的评论;)在手册页open()fork()有一个区别文件DESCRIPT,或者和一个文件descipt离子 -前者是指到了后来,虽然在一个叉的描述符的副本,他们指的是相同的描述。但是,经过测试很明显,这并不意味着关闭孩子的手柄会关闭父母的手柄。我认为,当两个句柄都进行写操作时,这可能会对数据的交错产生微妙的影响,但是无论如何这都是不确定的,因此确切如何发生并不那么重要。
goldilocks 2013年

Answers:


21

当孩子被分叉时,它会继承父对象的文件描述符,如果孩子关闭了文件描述符,将会发生什么?

它继承了文件描述符的副本。因此,在子级中关闭描述符将为子级(而不是父级)关闭描述符,反之亦然。

如果孩子开始写文件,那么在父母的末端文件将如何处理?谁来管理这些不一致,内核还是用户?

它与写入同一文件的两个进程完全相同(从字面上看)。内核独立地调度进程,因此您很可能会在文件中获取交错的数据。

当进程调用关闭函数通过文件描述符关闭特定打开的文件时,进程的文件表会将引用计数减一,但是由于父级和子级都持有相同的文件(刷新计数为2,关闭后减少到1),因为它不是零,所以进程仍然可以继续使用文件而没有任何问题。

有两个进程,父进程和子进程。两者没有共同的“参考计数”。他们是独立的。WRT当其中一个关闭文件描述符时会发生什么,请参阅第一个问题的答案。


1

每当生fork()一个新孩子时,文件描述符就根本不会保留-它们会被更改。

尽管该文件将是重复的,但它将具有不同的文件描述符。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.