每个进程都有一个文件描述符表(FDT),每个文件都有一个文件描述符。stdin,stdout和stderr的文件描述符分别为0,1和2。这些值对于所有进程都相同。我认为FDT包含对这些文件的INODE条目的引用。文件描述符在进程之间重复使用,即它们不是全局唯一的。内核是否维护一个全局FDT,以便每个进程的FDT引用?stdin,stdout和stderr的FDT对应什么?这些特殊文件是否与键盘,显示器等链接在一起?
请提供有关该主题的文章、书籍等链接。
请提供有关该主题的文章、书籍等链接。
struct file
, 它包含有关打开文件或设备的所有信息。文件描述符实际上只是进程的FDT中的索引。在Linux内核中,struct file
通过函数fd_install()
附加到FDT上。可以通过dup2
系统调用将struct file
重新分配给另一个文件描述符。CLONE_FILES
标志的clone
系统调用创建的,则进程可以共享相同的FDT,但没有全局FDT。普通的fork
操作会创建一个新的FDT,它是父FDT的副本。这个的实际用途是为多线程应用程序的每个线程创建一个克隆的进程,共享一个公共的FDT,确保所有线程都可以使用相同的整数文件描述符。如果您使用fork
/exec
创建一个新进程,则新进程将以相同的文件描述符启动,但可以打开和关闭文件而不影响父进程。