Linux之IO系统调用接口与文件描述符
系统调用接口
- open接口
1、 头文件
#include
#include
#include
2、函数原型
int open(const char *pathname, int flags);
int open(const char *pathname, int flags, mode_t mode);
3、参数
pathname: 要打开或创建的目标文件
flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
mode 创建文件的权限
4、相关宏定义:
O_RDONLY: 只读打开
O_WRONLY: 只写打开
O_RDWR : 读,写打开
这三个常量,必须指定一个且只能指定一个
O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
O_APPEND: 追加写
5、返回值
成功:新打开的文件描述符
失败:-1 - write接口
1、头文件
#include
2、函数原型
ssize_t write(int fd, const void *buf, size_t count);
3、参数
fd:open返回的文件描述符
buf:要写入的数据
count:要写入的数据长度
4、返回值
成功:实际写入的数据长度
失败:-1 - read接口
1、头文件
#include
2、函数原型
ssize_t read(int fd, void *buf, size_t count);
3、参数
fd:open返回的文件描述符
buf:要读入的数据的内存首地址
count:要读取的数据长度
4、返回值
成功:实际读取的数据长度
失败:-1 - lseek接口
1、 头文件
#include
#include
2、函数原型
off_t lseek(int fd, off_t offset, int whence);
3、参数
fd: 文件描述符
offset: 偏移量
whence : 选项参数
4、相关宏定义:
SEEK_SET:从文件起始位置开始偏移
SEEK_CUR:从文件当前位置开始偏移
SEEK_END:从文件末尾位置开始偏移
5、返回值
成功:相对于文件起始位置的偏移量
失败:-1 - close接口
1、头文件
#include
2、函数原型
int close(int fd);
3、参数
fd:open时的文件描述符
4、返回值
成功:0
失败:-1
注:以上接口调用失败都会重置errno.
文件描述符
- 概念:文件描述符(file descriptor)是操作系统内核为了高效管理已被打开的文件所创建的索引,其是一个非负整数(通常是小整数),用于指代被打开的文件。用户操作文件的时候,将这个索引传给操作系统,操作系统通过索引找到文件描述信息,进而操作文件。一个程序刚刚启动的时候,会默认打开三个文件,0是标准输入,1是标准输出,2是标准错误。
- 文件描述符的分配规则:最小未使用原则
因为一个程序运行起来之后会默认打开三个文件,那么当你再打开文件时,索引会从3开始,当某个文件关闭之后,便会找一个最小没有使用的空位置给新的的文件描述符使用,这就是最小未使用原则。
文件描述符与文件流指针的关系
- 文件描述符是系统调用接口的操作句柄
- 文件流指针是库函数的操作句柄
- 文件流指针这个FILE结构体中就包含一个文件描述符的成员变量。
用户态到内核态的改变
- 发起系统调用
重定向
- 重定向就是改变数据流向,将写入指定文件数据改变之后写入到另一个文件就是重定向。重定向指的是描述符的重定向,描述符本身没有发生改变,改变的是描述符所对应的文件信息。
- dup2(int oldfd , int newfd)
让newfd指向oldfd所指向的文件,如果newfd本身打开文件,则关闭原先打开的文件 重定向符
清空原有内容 类似 O_TRUNC
追加新内容 类似 O_APPEND
还没有评论,来说两句吧...