【Linux】fd与FILE结构体

【问题描述】:练习open/read/write/close等文件相关系统调用接口,纵向对比fd与FILE结构体

标准库中的IO接口:fopen(path, mode(" r:只读      r+:可读可写     w:只写,文件不存在时创建,写入时会发生截断     w+:可读可写       a:追加写      a+:可读可写"))、fwrite/freadfseekfclose  

系统调用IO接口基本使用:openwritereadlseekclose

重点介绍一下open的使用:

int open(const char* pathname,int flags,mode_t mode);

功能:打开文件

pathname:指定要打开的文件名称

flags:选项参数

必选参数:O_RDONLY      O_WRONLY      O_RDWR------只能选择其一

可选参数:

  • O_CREAT:若文件存在则打开,不存在则创建文件
  • O_EXCL:与O_CREAT同时使用,若文件存在则报错,不存在则创建
  • O_TRUNC:打开文件同时截断文件为0长度
  • O_APPEND:写数据的时候总是写到已有数据之后

返回值:文件描述符(正整数)         失败:-1

文件描述符:正整数    内核中文件描述信息结构体数组的下标。struct file* fd _array[]

文件描述符的分配规则:最小未使用

下面看一下系统调用IO接口的具体使用:

【Linux】fd与FILE结构体

接下来我们看一下文件描述符与文件流指针的关系:

库函数和系统调用接口的关系是上下级的封装调用的关系:库函数调用的就是系统调用接口。所以库函数实现文件的操作最终还是要落到系统调用接口上。通过文件流指针找到文件描述符,然后与系统调用接口相同,完成文件操作目的。

库函数操作的是文件流指针FILE*,系统调用接口操作的是文件描述符fd。

【Linux】fd与FILE结构体