帮助Unix中的文件描述符

时间:2011-09-22 07:09:13

标签: linux unix

每个进程都有一个文件描述符表(FDT),每个文件都有一个文件描述符。 stdin,stdout和stderr的文件描述符是0,1和2.这些值对于所有进程都是相同的。我认为FDT包含对这些文件的INODE条目的引用。文件描述符跨进程重用,即它们不是全局唯一的。是否存在由内核维护的全局FDT,每个进程的FDT引用?对stdin,stdout和stderr的FDT对应的是什么?这些特殊文件是否与键盘,显示器等相关联。 请提供文章,书籍等链接。

1 个答案:

答案 0 :(得分:7)

一个很好的起点是2001年的文章"A small trail through the Linux kernel"。这些机制仍然相似,但实施工作已经进行,并且最好在a more recent kernel中进行研究。

在内核中,每个打开的文件描述符对应一个struct file,其中包含有关打开文件或设备的所有信息。文件描述符实际上只不过是进程的FDT索引。在Linux内核中,struct file通过函数fd_install()附加到FDT。 struct file可以将clone重新分配给另一个文件描述符。

如果进程是由带有dup2 system call标志的fork系统调用创建的,则进程可以共享相同的FDT,但是没有全局FDT。正常的fork操作会创建一个新的FDT,它是父FDT的副本。实际使用此方法是将多线程应用程序的每个线程作为共享公共FDT的克隆进程,确保所有线程都可以使用相同的整数文件描述符。如果使用exec / {{1}}创建新进程,则新进程以相同的文件描述符开头,但可以在不影响父进程的情况下打开和关闭文件。

stdin,stdout,stderr的FDT条目是从父级继承的。他们对这三个FDT条目的内核实现没有什么特别之处;它们的含义来自C库的常规用法。父进程单独决定它们所连接的内容。它们可能连接到字符设备,或者它们可能已连接到文件或管道。对于字符设备的情况,最常见的是tty或pty设备。免费图书CLONE_FILESLinux Device Drivers个。