FILE* 和文件描述符及其相互转换【系统编程】

本文详细介绍了FILE*在C语言中的作用,以及文件描述符如何与之关联。通过系统接口open和close操作,解释了文件描述符的分配规则,并展示了FILE和文件描述符之间的转换函数,如fileno和fdopen。
摘要由CSDN通过智能技术生成

FILE*(文件指针)

  每个被使用的文件都会在内存中开辟一个相应的文件信息区,用来存储文件的相关信息(包含文件的名字,文件状态及文件当前的位置等)。这些信息被集合在一个结构体中,这个结构体也叫做FILE。
在这里插入图片描述

在这里插入图片描述
  可以看到FILE结构体里面有很多的属性。
  一般我们都是使用一个FILE的指针来维护一个文件,这样用起来会方便许多。
  通过文件指针变量就能够找到与之相关联的文件信息:
在这里插入图片描述

文件描述符

  开始之前先来介绍使用系统接口open来打开一个文件的流程:open -> 从PCB也就是task_struct中找到files指针 -> file指针指向结构体files_struct -> files_struct中有一个重要的部分是fd_array[]数组,里面包含一个file指针 -> 通过这个file指针就可以指向一个file结构体 -> 这个file结构体中含有文件的所以信息,于是就找到了相应的文件。文件描述符就是fd_array[]数组的下标,所以文件描述符是从0开始的。只要拿着文件描述符就能找到对应的文件。

在这里插入图片描述
为什么这么繁琐呢?
  这是降低了进程管理和文件管理的耦合度,使得进程管理这块,我们拿着文件描述符就能找到对应的文件,不用管文件管理的事。

0 & 1& 1

  • Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0, 标准输出1, 标准错误2.
  • 0,1,2对应的物理设备一般是:键盘,显示器,显示器
  • 所以当我们还需要打开其他文件的时候,一般都是从3开始向后分配的。

文件描述符的分配规则

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> 
int main()
{
	int fd = open("F:\\比特就业课\\t.txt", O_WRONLY);
	printf("%d", fd);
	return 0;
}

在这里插入图片描述
  不出所料,分配的文件描述符就是3。
  当我们关闭0号文件描述符后:

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h> 
int main()
{
	close(0);
	int fd = open("F:\\比特就业课\\t.txt", O_WRONLY);
	printf("%d", fd);
	return 0;
}

在这里插入图片描述

  由此可以得到结论:文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符。

文件描述符和FILE的联系

FILE是一个struct结构体,有C标准库提供,C文件库函数内部一定会调用系统调用,所以使用FILE,实际内部使用的是fd,在系统的角度上来看,FILE和fd,只认fd。
FILE结构体里面一定会存在一个属性是文件描述符,当使用FILE是就能通过文件描述符找到底层的file结构体,获取文件信息。

在这里插入图片描述

FILE和文件描述符的相互转换:

FILE* --> fd :
#inlcude <stdio.h>
int fileno(FILE *stream);

fd --> FILE* :
#include <stdio.h>
FILE *fdopen(int fd, const char *mode);

  • 33
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

112233123hd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值