• C语言IO操作fread/fwrite/fflush


    参考
    1
    2

    IO操作

    fread/fwrite/fflush:

    1. c语言标准规定的io流操作,建立在read/write/fsync之上;
    2. 在用户层, 又增加了一层缓冲机制,用于减少内核调用次数,但是增加了一次内存拷贝;

    read/write/fsync:

    1. linux底层操作;
    2. 内核调用, 涉及到进程上下文的切换,即用户态到核心态的转换,这是个比较消耗性能的操作;

    两者之间的关系如下:
    在这里插入图片描述
    可以将fread,fwrite是一种批量写入,而read,write是单次写入的形式来理解。
    write是系统调用,每次需要将数据写到磁盘,写的大小是要求的大小,依然涉及频繁的用户态和内核态切换;
    fwrite是库函数,每次将数据写入到缓冲区,等缓冲区满了,一次写入磁盘。或者使用 fflush 冲洗缓冲区;
    fflush:是把C库中的缓冲调用write函数写到磁盘(其实是写到内核的缓冲区)。
    fsync:是把内核缓冲刷到磁盘上。

    注意:

    (1)fwrite
    fwrite每次将数据写入到缓冲区,等缓冲区满了,一次写入磁盘;存在延迟写入、或对线程访问文件数据异常问题;为解决该问题,可使用fflush()函数,及时刷新缓存、写入;
    (2)fflush:标准I/O函数(如:fread,fwrite)会在内存建立缓冲,该函数刷新内存缓冲,将内容写入内核缓冲,要想将其写入磁盘,还需要调用fsync。(先调用fflush后调用fsync,否则不起作用)。
    (3)fflush()与fsync()的联系:
    对于输入设备,调用fsync/fflush将清空相应的缓冲区,其内数据将被丢弃;对于输出设备或磁盘文件,fflush只能保证数据到达内核缓冲区,并不能保证数据到达物理设备, 因此应该在调用fflush后,调用fsync(fileno(stream)),确保数据存入磁盘。
    (4)fdatasync:类似fsync,但它只影响文件的数据部分;
    fdatasync与fsync的区别在于fdatasync不会flush文件的metadata信息;这个是为了减少对磁盘的操作;如果以块为单位知道写入多少数据,可以使用fdatasync;
    如下:

    #include 
    #include 
    #include 
    #include 
    
    int main(int argc, char **argv){
    
            FILE *fp = fopen("test.txt","w");
            char *line ="Test";
            char *fill ="\0";
            fwrite(fill, 1, 100*strlen(line), fp);
            fflush(fp);
            fsync(fileno(fp));
            rewind(fp);
            for (int i = 0; i < 100; i++){
                    fwrite(line, strlen(line), 1, fp);
                    fflush(fp);
                    fdatasync(fileno(fp));
            }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
  • 相关阅读:
    《用Go语言自制解释器》之第5章 宏系统
    【深入解析spring cloud gateway】07 自定义异常返回报文
    2023贵州师范大学计算机考研信息汇总
    Squid代理服务器(缓存加速之Web缓存层)
    计算机毕业设计Java校园社团管理系统(源码+系统+mysql数据库+Lw文档)
    改写二分搜索算法
    【题解】盛最多水的容器
    什么是数据结构?什么是算法?怎么学习数据结构与算法?
    【JavaWeb开发-Servlet】day01-使用TomCat实现本地web部署
    TSC TTP244Pro 打码机出现的问题及解决方案
  • 原文地址:https://blog.csdn.net/zfjBIT/article/details/128102368