标准C库IO函数和Linux系统IO函数

标准C库IO函数

标准C库IO函数相比于Linux系统IO函数为更高层的实现(前者的实现需要调用后者),具体使用哪一种视场景而定。
标准C库IO函数和Linux系统IO函数_第1张图片
标准C库IO函数和Linux系统IO函数_第2张图片

虚拟地址空间

标准C库IO函数和Linux系统IO函数_第3张图片

文件描述符

标准C库IO函数和Linux系统IO函数_第4张图片

Linux系统IO函数实例

在学习以及使用不同函数时,要善于利用函数自身的帮助文档,如若学习open函数:

man 2 open

其中,Linux 下 man 指令使用参考如下博客:
Linux命令-man

  • open()
/*
    #include 
    #include 
    #include 


    // 打开一个已经存在的文件
    int open(const char *pathname, int flags);
        参数:
            - pathname: 要打开的文件路径
            - flags:    对文件的操作权限设置还有其他的设置
              O_RDONLY, O_WRONLY, or O_RDWR   这三个设置是互斥的
        返回值:返回一个新的文件描述符,如果调用失败,返回-1

    errno:属于Linux系统函数库,库里面的一个全局变量,记录的是最近的错误号。
    
    #include 
    void perror(const char *s);   // 作用:打印errno对应的错误描述
        s参数:用户描述,比如hello,做种输出的内容是  hello:xxx(实际的错误描述)
    

	// 创建一个新的文件
    int open(const char *pathname, int flags, mode_t mode);
        参数:
            - pathname:要创建的文件路径
            - flags:   对文件的操作权限和其他的设置
                - 必选项:O_RDONLY, O_WRONLY, or O_RDWR 这三个之间是互斥的
                - 可选项:O_CERAT
            - mdoe:八进制的数,表示用户对创建出的新的文件的操作权限, 比如:0775
            最终的权限是:mode & ~umask
            0777  &  ~0002   ->   0777  &  0775  ->  111111111  &  111111101   ->   111111101  ->  0775  (rwxrwxr-x)

            umask的作用就是抹去某些权限


            flags参数是一个int类型的数据,占4个字节,32位
            flags 32个位,每一位就是一个标志位
*/
  • read()、write()
/*
    #include 
    ssize_t read(int fd, void *buf, size_t count);
        参数:
            - fd:文件描述符,open得到的,通过这个文件描述符操作某个文件
            - buf: 需要读取数据存放的地方,数组的地址(传出参数)
            - count:指定的数组的大小
        返回值:
            - 成功:
                >0:返回实际的读取到的字节数
                =0:文件已经读完了
            - 失败:
                -1:并设置errno

    #include 
    ssize_t write(int fd, const void *buf, size_t count);
        参数:
            - fd:文件描述符,open得到的,通过这个文件描述符操作某个文件
            - buf:要往磁盘写入的数据,数组
            - count:要写的数据的实际的大小
        返回值:
            - 成功:实际写入的字节数
            - 失败:返回-1,并设置errno
*/
  • lseek()
/* 
    标准C库的函数
    #include 
    int fseek(FILE *stream, long offset, int whence);

    Linux系统函数
    #include 
    #include 
    off_t lseek(int fd, off_t offset, int whence);
        参数;
            - fd:文件描述符,通过open得到的,通过这个fd操作某个文件
            - offset:偏移量
            - whence:
                SSEK_SET
                    设置文件指针的偏移量
                SEEK_CUR
                    设置偏移量:当前位置 + 第二个参数offset的值
                SEEK_END
                    设置偏移量:文件大小 + 第二个参数offset的值
        返回值:返回文件指针的位置

    作用:
        1、移动文件指针到文件头
            lseek(fd, 0, SEEK_SET)
        2、获取当前文件指针位置
            lseek(fd, 0, SEEK_CUR)
        3、获取文件长度
            lseek(fd, 0, SEEK_END)
        4、拓展文件的长度,当前文件10b,110b,增加了100字节
            lseek(fd, 100, SEEK_END)    // 注意:需要写一次数据
*/
  • stat()、lstat()
/*
    #include 
    #include 
    #include 

    int stat(const char *pathname, struct stat *statbuf);
        作用:获取一个文件相关的信息
        参数:
            - pathname:操作的文件的路径
            - statbuf:结构体变量,传出参数,用于保存获取到的文件信息
        返回值:
            成功:返回0
            失败:返回-1,设置errno

    int lstat(const char *pathname, struct stat *statbuf);
        获取软连接文件的信息
*/

其中,stat结构体内容如下:
标准C库IO函数和Linux系统IO函数_第5张图片
标准C库IO函数和Linux系统IO函数_第6张图片

你可能感兴趣的:(Linux服务器开发)