struct file与文件描述符的关系及相关技术疑问咨询
Linux内核中struct file与文件描述符的关系解析
问题1:struct file与文件描述符是否为多对一关系?同一进程内的多个文件描述符能否共享一个struct file?
是多对一关系,同一进程内的多个文件描述符完全可以共享同一个struct file实例。最常见的场景就是调用dup()或dup2()系统调用复制文件描述符——复制出来的新fd和原fd指向的是同一个内核struct file对象,它们共享文件的打开状态、偏移量等信息。
问题2:不同进程中的多个文件描述符能否共享同一个struct file?
可以。典型的场景有两种:
- 父子进程继承:当父进程调用
fork()创建子进程后,子进程会完整继承父进程的文件描述符表,所有继承来的fd都会指向和父进程相同的struct file实例。 - 跨进程传递文件描述符:通过UNIX域套接字,进程可以把自己的文件描述符传递给另一个进程,接收方的新fd会指向同一个
struct file对象。
问题3:内核如何跟踪文件偏移量等文件描述符专属信息?
首先要纠正一个认知:文件偏移量(f_pos)并不是文件描述符的专属信息,它是存在struct file结构体里的共享状态——也就是说,只要多个fd共享同一个struct file,它们的文件偏移量就是共用的,对其中一个fd做lseek()或读写操作,会直接改变所有共享该struct file的fd的偏移量。
而真正属于文件描述符专属的属性(比如FD_CLOEXEC标志,控制进程执行exec()时是否关闭该fd),内核是存在进程自身的文件描述符表项中的(对应struct fd结构体,每个fd项包含指向struct file的指针和专属标志)。
内容的提问来源于stack exchange,提问作者tristone
相关产品推荐
相关产品推荐

