文件描述符

文件描述符其实就是一些非0整数,他们代表着对应的文件,换句话说,对文件描述符进行操作就是在对文件进行操作

涉及到文件描述符的创建的一般常用的就以下几个(以目前所学来看)

  // 打开文件 open
  int fd = open(filepath, O_CREAT | O_RDONLY, 0644); 
  // 复制文件描述符 dup() 和dup2()
  int newfd = dup(oldfd); // 复制文件描述符,无法自己指定newfd 
  int new_fd = dup2(oldfd, newfd); // 可以自己指定newfd

以上只是使用的简单例子,具体的方法大家自行查阅

现在再来看看文件描述符和文件之间的关联吧:

1

首先,每个进程都有一个 文件描述符表,相互独立,自成一套,可以称之为 进程级,这个区域的文件描述符,由dup函数复制的和open函数打开的,会在这里显示,并且有个指针域指向对应 打开文件句柄

然后,会有一个 打开文件表, 这是 系统级 的,这个区域的文件描述符,称之为 打开文件句柄, 由open函数打开的会在这里显示,并且如果有多个进程级的文件描述符共同指向一个打开文件句柄,那他们 共享文件偏移量,然后还有个指针域指向对应的 i-node

最后,有一个 i-node表, 这是 系统级 的,这里存储的信息就是真正的文件信息了(文件内容在磁盘上,每个文件都有一个对应的i-node指向他)

如果大家对系统调用比较熟悉的话(open, write, lseek),可以看看下面的例题,看看自己是否清楚
2

最后的文件内容是 Giddayworld, 大家自己画画图就能明白了,注意每个函数会影响的表

文件流

首先,我们要清楚,文件描述符是系统调用所有的,文件流是库函数所有的,这两个的层级不同,然后文件流的使用,最后都会转换成文件描述符的使用

换句话说,文件描述符是底层,文件流是它的一个抽象的接口,功能会更丰富,两者的本质是一样的

举个例子,文件描述符中有三个标准的文件描述符,对应的也有三个标准的文件流

  /* 文件描述符 --- 文件流 */
  // 标准输入
  STDIN_FILENO --- stdin
  // 标准输出
  STDOUT_FILENO --- stdout
  // 标准错误
  STDERR_FILENO --- stderr

然后使用文件流就需要对应的库函数了,比如fopen等等

 posted on 2024-09-23 11:33  Dylaris  阅读(45)  评论(0)    收藏  举报