文件描述符 fd

Posted by Jacobc on Monday, March 15, 2021

文件描述符(File descriptor)是计算机科学中的一个术语,是一个用于表述指向文件的引用的抽象化概念。

文件描述符在形式上是一个非负整数。实际上,它是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。在程序设计中,一些涉及底层的程序编写往往会围绕着文件描述符展开。但是文件描述符这一概念往往只适用于 UNIX、Linux 这样的操作系统。

Linux下两个进程打开同一个文件返回的文件描述符一样吗?

答案:不一样

  1. 两个进程中分别产生生成两个独立的fd
  2. 两个进程可以任意对文件进行读写操作,操作系统并不保证写的原子性
  3. 进程可以通过系统调用对文件加锁,从而实现对文件内容的保护
  4. 任何一个进程删除该文件时,另外一个进程不会立即出现读写失败
  5. 两个进程可以分别读取文件的不同部分而不会相互影响
  6. 一个进程对文件长度和内容的修改另外一个进程可以立即感知

文件描述符与打开文件的关系

  1. 内核中,对应于每个进程都有一个文件描述符表,表示这个进程打开的所有文件。
  2. 文件描述表中每一项都是一个指针,指向一个用于描述打开的文件的数据块——file对象,file对象中描述了文件的打开模式,读写位置等重要信息,当进程打开一个文件时,内核就会创建一个新的file对象。
  3. file对象不是专属于某个进程的,不同进程的文件描述符表中的指针可以指向相同的file对象,从而共享这个打开的文件。
  4. file对象有引用计数,记录了引用这个对象的文件描述符个数,只有当引用计数为0时,内核才销毁file对象,因此某个进程关闭文件,不影响与之共享同一个file对象的进程。

image

参考文章:

  1. linux下两个进程可以同时打开同一个文件吗?返回的文件描述符一样吗?
  2. Linux IO模式及 select、poll、epoll详解

「如果这篇文章对你有用,请随意打赏」

Jacobc' Blog

如果这篇文章对你有用,请随意打赏

使用微信扫描二维码完成支付