2011-09-22 95 views
6

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

回答

7

一个很好的出发点是自2001年的文章"A small trail through the Linux kernel"的机制仍然是类似的,虽然实现已经在移动和最好在a more recent kernel研究。

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

如果进程是由clone系统调用与CLONE_FILES标志创建的,但没有全局FDT,则进程可以共享相同的FDT。正常的fork操作会创建一个新的FDT,它是父FDT的副本。这样做的实际用途是使多线程应用程序的每个线程成为共享一个公共FDT的克隆进程,确保所有线程都可以使用相同的整数文件描述符。如果使用fork/exec创建新进程,则新进程将从相同的文件描述符开始,但可以在不影响父级的情况下打开和关闭文件。

stdin,stdout,stderr的FDT条目是从父级继承的。这三个FDT条目的内核实现没有什么特别之处;它们的含义来自C库的传统使用。父母过程本身决定他们连接到什么。它们可能连接到字符设备,或者它们可能已连接到文件或管道。对于字符设备的情况,最正常的是成为一个tty或pty设备。免费书Linux Device Driversa good overview这些。

+1

在段落3的末尾,我认为你的意思是一个子进程可以打开和关闭文件而不影响父文件 –