什么是打开的文件描述?

8 file-descriptors fork processes

当您 fork 一个进程时,子进程继承其父进程的文件描述符。我知道当发生这种情况时,子进程会收到一份父文件描述符表的副本,每个表中的指针都指向相同的打开文件描述。这是与文件表相同的东西,如http://en.wikipedia.org/wiki/File_descriptor,还是其他东西?

Gil*_*il' 19

    文件描述符 ? 打开文件说明?目录项
               dup                open                    cp

从进程中打开的文件一直到文件内容时,有几个间接级别。在实现方面,这些级别通常转化为内核中指向下一个级别的数据结构。我将描述一个简单的实现;真正的实现可能会有更多的复杂性。

进程中打开的文件由文件描述符指定,它是一个小的非负整数。数字 0、1 和 2 具有常规含义:进程应该从 0(标准输入)读取正常输入,将正常输出写入 1(标准输出),并将错误消息写入 2(标准错误)。这只是一个约定:内核不在乎。内核为每个进程保存一个打开的文件描述符表,将这些小整数映射到文件描述符结构。在 Linux 内核中,这种结构是struct fd.

文件描述符结构包含一个指向打开文件描述的指针。可以有多个文件描述符指向同一个打开的文件描述,来自多个进程,例如当一个进程调用dup和朋友时,或者在一个进程分叉之后。如果文件描述符(即使在不同的进程中)是由于相同的原始open(或类似)系统调用,它们共享相同的打开文件描述。打开文件描述包含文件打开方式的信息,包括模式(只读 vs 读写、追加等)、在文件中的位置等。在 Linux 下,打开文件描述结构为struct file.

打开的文件描述位于文件 API 级别。下一个级别是文件系统API。区别在于文件 API 涵盖了文件系统树中不存在的匿名管道和套接字等文件。如果文件是目录树中的文件,则打开的文件描述包含指向目录条目的指针。如果同一个文件被open多次编辑,则可以有多个打开的文件描述指向同一个目录条目。目录条目包含有关文件内容的信息,包括指向其父目录的指针,以及有关文件所在位置的信息。在 Linux 内核中,目录条目分为两层:struct inode包含文件元数据和struct dentry 跟踪文件在目录树中的位置。


小智 3

我在开放系统调用的文档中找到了答案:

\n\n
\n

POSIX 使用术语“打开文件描述”来指代系统范围的打开文件表中的条目。在其他上下文中,该对象也被称为“打开文件对象”、“文件句柄”、“打开文件表条目”或内核开发人员用语中的 \xe2\x80\x94\xe2\x80\x94a 结构文件。当文件描述符被复制时(使用 dup(2) 或类似方法),副本引用与原始文件描述符相同的打开文件描述,因此两个文件描述符共享文件偏移量和文件状态标志。这种共享也可以发生在进程之间:通过 fork(2) 创建的子进程继承其父进程的文件描述符的副本,并且这些副本引用相同的打开文件描述。文件的每次 open(2) 都会创建一个新的打开文件描述;因此,一个文件inode可能对应多个打开的文件描述。

\n
\n