Linux之IO系统调用接口与文件描述符

系统调用接口

  • open接口
    1、 头文件
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <fcntl.h>
    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 <unistd.h>
    2、函数原型
    ssize_t write(int fd, const void *buf, size_t count);
    3、参数
    fd:open返回的文件描述符
    buf:要写入的数据
    count:要写入的数据长度
    4、返回值
    成功:实际写入的数据长度
    失败:-1

  • read接口
    1、头文件
    #include <unistd.h>
    2、函数原型
    ssize_t read(int fd, void *buf, size_t count);
    3、参数
    fd:open返回的文件描述符
    buf:要读入的数据的内存首地址
    count:要读取的数据长度
    4、返回值
    成功:实际读取的数据长度
    失败:-1

  • lseek接口
    1、 头文件
    #include <sys/types.h>
    #include <unistd.h>
    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 <unistd.h>
    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

猜你喜欢

转载自blog.csdn.net/qq_43503315/article/details/89220428