【Linux】fd与FILE结构体
【问题描述】:练习open/read/write/close等文件相关系统调用接口,纵向对比fd与FILE结构体
标准库中的IO接口:fopen(path, mode(" r:只读 r+:可读可写 w:只写,文件不存在时创建,写入时会发生截断 w+:可读可写 a:追加写 a+:可读可写"))、fwrite/fread、fseek、fclose
系统调用IO接口基本使用:open、write、read、lseek、close
重点介绍一下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接口的具体使用:
接下来我们看一下文件描述符与文件流指针的关系:
库函数和系统调用接口的关系是上下级的封装调用的关系:库函数调用的就是系统调用接口。所以库函数实现文件的操作最终还是要落到系统调用接口上。通过文件流指针找到文件描述符,然后与系统调用接口相同,完成文件操作目的。
库函数操作的是文件流指针FILE*,系统调用接口操作的是文件描述符fd。