iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >【Linux】文件缓冲区
  • 542
分享到

【Linux】文件缓冲区

linux网络 2023-09-06 12:09:56 542人浏览 八月长安
摘要

目录 一、缓冲区图解二、自定义实现文件操作函数三、强制刷新内核缓冲区(fsync) 提到文件缓冲区这个概念我们好像并不陌生,但是我们对于这个概念好像又是模糊的存在脑海中,之间我们在介绍

目录

提到文件缓冲区这个概念我们好像并不陌生,但是我们对于这个概念好像又是模糊的存在脑海中,之间我们在介绍c语言文件操作已经简单的提过这个概念,今天我们不妨深入理解什么是文件缓冲区

一、缓冲区图解

在这里插入图片描述

二、自定义实现文件操作函数

通过自己实现库中的一些文件操作函数更加深入的理解文件缓冲区
自定义实现的myopen和库里面的open功能大致相同。mywrite和write大致相同。myclose和close大致相同,
通过自定义实现这些系统接口,可以更加深入的了解文件在进行读写的时候系统做了哪些事情。

mystdio.h

  1 #pragma once  2   3 #include<stdio.h>  4   5 #define NUM 1024  6 #define BUFF_NONE 0x1  7 #define BUFF_LINE 0x2  8 #define BUFF_ALL  0x4  9  10 typedef struct MY_FILE 11 { 12     int fd; 13     int flags;  //flush method 刷新方式 14     char outputbuffer[NUM]; //缓冲区 15     int current; 16  17 }MY_FILE; 18  19 MY_FILE* my_fopen(const char* path,const char* mode); 20  21 size_t my_fwrite(const void* ptr,size_t size,size_t nmemb,MY_FILE* stream); 22  23 int my_fflush(MY_FILE* fp);                    24  25 int my_fclose(MY_FILE*fp);

mystdio.c

  1 #include "mystdio.h"  2 #include<string.h>  3 #include<sys/types.h>  4 #include<sys/stat.h>  5 #include<fcntl.h>  6 #include<unistd.h>  7 #include<malloc.h>  8 #include<assert.h>  9  10 //fopen("xxx","a"); 11 MY_FILE* my_fopen(const char* path,const char* mode) 12 { 13     //1.识别标志位 14     int flag=0; 15     if(strcmp(mode,"r")==0)flag|=O_RDONLY; 16     else if(strcmp(mode,"w")==0)flag|=(O_CREAT | O_WRONLY | O_TRUNC); 17     else if(strcmp(mode,"a")==0)flag|=(O_CREAT | O_WRONLY | O_APPEND); 18     else{ 19         //other operator  "r+" ,"w+" "a+" 20     } 21     //2.尝试打开文件 22     mode_t m=0666; //文件权限 23     int fd=0; 24     if(flag & O_CREAT)fd=open(path,flag,m); 25     else fd=open(path,flag); 26                    27     if(fd<0)return NULL; //打开文件失败 28  29     //3.给用户返回MY_FILE对象,需要构建 30     MY_FILE* mf= (MY_FILE*)malloc(sizeof(MY_FILE)); 31     if(mf==NULL) 32     { 33         close(fd); //创建结构体失败,关闭文件,返回NULL                    34         return NULL; 35     } 36  37     //4.初始化MY_FILE对象 38     mf->fd = fd; 39     mf->flags=0; 40     mf->flags |= BUFF_LINE; 41     memset(mf->outputbuffer,'\0',sizeof(mf->outputbuffer)); 42     mf->current=0; 43     //mf->outputbuffer[0]=0; //初始化缓冲区 44      45     //5.返回打开的文件 46     return mf; 47 } 48  49  50 int my_fflush(MY_FILE* fp) 51 { 52     //将用户层缓冲区中的数据,通过系统调用接口,冲刷给OS 53     assert(fp); 54     write(fp->fd,fp->outputbuffer,fp->current); 55     //... 56     fp->current=0; 57     return 0; 58 } 60 //返回实际写入的字节数 61 size_t my_fwrite(const void* ptr,size_t size,size_t nmemb,MY_FILE* stream) 62 { 63     //1.缓冲区如果已经满了,直接写入           64     if(stream->current==NUM)my_fflush(stream); 65      66     //2.根据缓冲区剩余情况,进行数据拷贝 67     size_t user_size= size*nmemb; //要写入多少数据 68     size_t my_size=NUM-stream->current; //缓冲区还剩多少空间 69  70     int writen=0; 71     if(my_size>=user_size) 72     { 73         //缓冲区剩余空间可以容纳要写入的数据 74         memcpy(stream->outputbuffer+stream->current,ptr,user_size); 75         //3.更新计数器字段 76         stream->current += user_size; 77         writen=user_size; 78     }else 79     { 80         memcpy(stream->outputbuffer+stream->current,ptr,my_size); 81         //3.更新计数器字段 82         stream->current+=my_size; 83         writen=my_size; 84     } 85  86     //3.开始计划刷新87     //不发生刷新的本质就是不进行IO,不进行系统调用,所以my_write函数会调用非常快,数据暂时保存在缓冲区    中 88     //可以在缓冲区积压多份数据,统一进行刷新  本质:就是一次IO可以IO更多的数据,提高IO效率 89     if(stream->flags & BUFF_ALL)               90     { 91         if(stream->current==NUM)my_fflush(stream); //全缓冲 92     }else if(stream->flags & BUFF_LINE) 93     { 94         if(stream->outputbuffer[stream->current-1]=='\0')my_fflush(stream); 95     }else{} 96     return writen; 97 } 98  99 100 int my_fclose(MY_FILE*fp)101 {102     assert(fp);103     //1.冲刷缓冲区104     if(fp->current>0)105     {106         my_fflush(fp);107     }108     //2.关闭文件109     close(fp->fd);110     //3.释放堆空间111     free(fp);112     //4.指针置为NULL 113     fp=NULL;114     return 0;115 }

main.c

  1 #include"mystdio.h"  2 #include<unistd.h>  3 #include<string.h>  4   5 #define MYFILE "log.txt"  6   7 int main()  8 {  9     MY_FILE* fp=my_fopen(MYFILE,"w"); 10     if(fp==NULL)return 1; 11  12  13     const char* msg="hello my write"; 14     int cnt=5; 15     //操作文件 16     while(cnt) 17     { 18         char buffer[1024]; 19         snprintf(buffer,sizeof(buffer),"%s:%d\n",msg,cnt--);               20         size_t size=my_fwrite(buffer,strlen(buffer),1,fp); 21         sleep(1); 22         printf("当前成功写入%lu个字节\n",size); 23     } 24     my_fclose(fp); 25     return 0; 26 }

运行结果
在这里插入图片描述

三、强制刷新内核缓冲区(fsync)

在这里插入图片描述

将文件缓冲区的内容强制刷新到文件中。

来源地址:https://blog.csdn.net/Tianzhenchuan/article/details/132608801

--结束END--

本文标题: 【Linux】文件缓冲区

本文链接: https://www.lsjlt.com/news/397044.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 【Linux】文件缓冲区
    目录 一、缓冲区图解二、自定义实现文件操作函数三、强制刷新内核缓冲区(fsync) 提到文件缓冲区这个概念我们好像并不陌生,但是我们对于这个概念好像又是模糊的存在脑海中,之间我们在介绍...
    99+
    2023-09-06
    linux 网络
  • Linux 命令 管道 缓冲区
    这是王工的一个问题.MySQL监控指标.使用 mysqladmin 每秒间隔获取信息, 将信息格式化后输出文件.获取信息和格式化的命令   mysqladmin -uroot -proot&...
    99+
    2023-06-06
  • 缓冲区溢出之LINUX实例
    缓冲区溢出是一种常见的安全漏洞,当输入数据超过了程序分配的缓冲区大小时,多余的数据会溢出到相邻的内存区域,导致程序崩溃或者被攻击者利...
    99+
    2023-09-15
    LINUX
  • Node.js Buffer(缓冲区)
    Node.js Buffer(缓冲区)JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放...
    99+
    2023-06-03
  • 浅析Java NIO 直接缓冲区和非直接缓冲区
    定义 以上是书《深入理解java虚拟机》对直接内存的描述。直接缓冲区用的就是直接内存。 java nio字节缓冲区要么是直接的,要么是非直接的。如果为直接字节缓冲区,则j...
    99+
    2024-04-02
  • 【Linux】基础IO —— 缓冲区深度剖析
    🌈欢迎来到Linux专栏~~基础IO ...
    99+
    2023-08-31
    linux unix 服务器
  • 将 html 页面内容(缓冲区)保存到 .log 文件
    最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《将 html 页面内容(缓冲区)保存到 .log 文件》主要内容涉及到等等知识点,希望能帮到你!当然如...
    99+
    2024-04-05
  • 如何通过JAVA NIO直接缓冲区拷贝文件
    这篇文章主要为大家展示了“如何通过JAVA NIO直接缓冲区拷贝文件”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“如何通过JAVA NIO直接缓冲区拷贝文件”这篇文章吧。通过JAVA NIO 直...
    99+
    2023-06-17
  • Java Buffer缓冲区(NIO)
    目录Java NIO(Buffer)1.1 Buffer 简介1.2 Buffer 的基本用法1、使用 Buffer 读写数据,一般遵循以下四个步骤:2、使用 ByteBuffer的...
    99+
    2024-04-02
  • Java NIO直接缓冲区和非直接缓冲区是什么
    这篇文章主要讲解了“Java NIO直接缓冲区和非直接缓冲区是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java NIO直接缓冲区和非直接缓冲区是什么”吧!定义j...
    99+
    2023-06-21
  • 如何在 Golang 中使用缓冲区优化文件读写?
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-15
  • 如何通过JAVA NIO非直接缓冲区拷贝文件
    小编给大家分享一下如何通过JAVA NIO非直接缓冲区拷贝文件,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!通过JAVA NIO 非直接缓冲区拷贝文件 ...
    99+
    2023-06-17
  • Golang函数的文件缓冲和网络缓冲的应用技巧
    Golang作为一种快速高效的编程语言,其函数提供了文件缓冲和网络缓冲的应用技巧。文件缓冲是在文件操作中使用的缓冲技巧,通过减少读写文件的次数来提高性能。网络缓冲则是网络通信中的一种必要技巧,可以提高网络传输的效率。下面将详细介绍这两种技巧...
    99+
    2023-05-18
    Golang 函数 缓冲。
  • python怎么缓冲二进制文件
    这篇文章主要介绍“python怎么缓冲二进制文件”,在日常操作中,相信很多人在python怎么缓冲二进制文件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”python怎么缓冲二进制文件”的疑惑有所帮助!接下来...
    99+
    2023-06-30
  • 缓冲区无法刷新
    编程网今天将给大家带来《缓冲区无法刷新》,感兴趣的朋友请继续看下去吧!以下内容将会涉及到等等知识点,如果你是正在学习Golang或者已经是大佬级别了,都非常欢迎也希望大家都能给我建议评论哈~希望能帮...
    99+
    2024-04-04
  • PHP将缓冲内容输出到文件
    这篇文章将为大家详细讲解有关PHP将缓冲内容输出到文件,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。PHP 将缓冲内容输出到文件 PHP 提供了多种将缓冲输出内容重定向到文件的函数,这在需要将动态生成的内...
    99+
    2024-04-02
  • go_package 选项在协议缓冲区文件中的作用是什么?
    大家好,今天本人给大家带来文章《go_package 选项在协议缓冲区文件中的作用是什么?》,文中内容主要涉及到,如果你对Golang方面的知识点感兴趣,那就请各位朋友继续看下去吧~希望能真正帮到你...
    99+
    2024-04-05
  • 一文带你了解Golang中的缓冲区Buffer
    目录1. Buffer 是什么2. 创建缓冲区2.1 使用 NewBuffer 函数创建2.2 使用 bytes.Buffer 结构体创建3. 写入数据4. 读取数据5. 截取缓冲区...
    99+
    2023-05-18
    Go 缓冲区Buffer Go 缓冲区 Go Buffer
  • python中什么是缓冲区
    这篇文章将为大家详细讲解有关python中什么是缓冲区,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Python的优点有哪些1、简单易用,与C/C++、Java、C# 等传统语言相比,Pyt...
    99+
    2023-06-14
  • 浅谈Redis缓冲区机制
    目录Redis缓冲区机制客户端缓冲机制应对输入缓冲区溢出查看输入缓冲区信息如何解决输入缓冲区溢出应对输出缓冲区溢出Monitor命令的执行输出缓冲区设置不合理主从集群中的缓冲区复制缓...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作