【问题标题】:Help with File descriptors in Unix帮助 Unix 中的文件描述符
【发布时间】:2011-11-22 13:52:06
【问题描述】:

每个进程都有一个文件描述符表(FDT),每个文件都有一个文件描述符。 stdin、stdout 和 stderr 的文件描述符是 0、1 和 2。这些值对于所有进程都是相同的。我相信 FDT 包含对这些文件的 INODE 条目的引用。文件描述符可跨进程重用,即它们不是全局唯一的。是否有一个由内核维护的全局 FDT,每个进程的 FDT 都引用它?标准输入、标准输出和标准错误的 FDT 分别对应什么?这些特殊文件是否链接到键盘、显示器等? 请提供文章、书籍等的链接。

【问题讨论】:

    标签: linux unix


    【解决方案1】:

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

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

    【讨论】:

    • 在第 3 段末尾,我认为您的意思是子进程可以打开和关闭文件 不会影响父进程
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-14
    相关资源
    最近更新 更多