国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Linux】模擬實(shí)現(xiàn)FILE以及認(rèn)識(shí)緩沖區(qū)

這篇具有很好參考價(jià)值的文章主要介紹了【Linux】模擬實(shí)現(xiàn)FILE以及認(rèn)識(shí)緩沖區(qū)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

刷新緩沖邏輯圖

【Linux】模擬實(shí)現(xiàn)FILE以及認(rèn)識(shí)緩沖區(qū),Linux,leetcode,linux,算法

自定義實(shí)現(xiàn)

mystdio.h
#pragma once 
#include <stdio.h>

#define NUM 1024
#define BUFF_NOME 0x1
#define BUFF_LINE 0x2
#define BUFF_ALL 0x4

typedef struct _MY_FILE
{
  int fd;//接受描述符的值
  int flags;//用來(lái)記錄打開(kāi)方式
  char outputbuffer[NUM];//緩沖區(qū)保存
  int current;//記錄緩沖區(qū)有多少字符
}MY_FILE;

MY_FILE* my_fopen(const char* path,const char* mode);
size_t my_fwrite(const void* ptr,size_t size,size_t nmemb,MY_FILE* stream);
int my_fclose(MY_FILE* fp);
int my_fflush(MY_FILE* fp);
mystdio.c
#include "mystdio.h"
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <assert.h>

MY_FILE* my_fopen(const char* path,const char* mode)
{
  //1.識(shí)別標(biāo)志位,打開(kāi)方式
  int flag = 0;
  if(strcmp(mode,"r") == 0) flag |= O_RDONLY;
  else if(strcmp(mode,"w") == 0) flag |= (O_CREAT | O_WRONLY | O_TRUNC);
  else if(strcmp(mode,"a") == 0) flag |= (O_CREAT | O_WRONLY | O_APPEND);
  else if(strcmp(mode,"r+") == 0) flag |= (O_WRONLY | O_RDONLY);
  else if(strcmp(mode,"w+") == 0) flag |= (O_CREAT | O_WRONLY | O_RDONLY | O_TRUNC);
  else if(strcmp(mode,"a+") == 0) flag |=(O_CREAT | O_WRONLY | O_RDONLY | O_APPEND);
  //2.嘗試打開(kāi)文件
  mode_t m = 0666;
  int fd = 0;
  if(flag | O_CREAT)
  {
    fd = open(path,flag,m);
  }
  else 
  {
    fd = open(path,flag);
  }

  if(fd < 0) return NULL;

  //3.給用戶返回MY_FILE對(duì)象,需要先進(jìn)行構(gòu)建
  MY_FILE *mf = (MY_FILE*)malloc(sizeof(MY_FILE));
  if(mf == NULL)
  {
    close(fd);
    return NULL;
  }

  //4.初始化MY_FILE對(duì)象
  mf->fd = fd;
  mf->flags = 0;
  mf->flags |= BUFF_LINE;
  memset(mf->outputbuffer,'\0',sizeof(mf->outputbuffer));
  mf->current = 0;

  //5.返回打開(kāi)的文件
  return mf;
}

//沖刷緩沖區(qū)
int my_fflush(MY_FILE* fp)
{
  assert(fp);
  //將用戶緩沖區(qū)的數(shù)據(jù),通過(guò)系統(tǒng)調(diào)用接口,沖刷給os
  write(fp->fd,fp->outputbuffer,fp->current);
  fp ->current = 0;

  //fsync(fp-fd);
  return 0;
}

//這里返回的是字節(jié)數(shù),不是模擬實(shí)現(xiàn)的輸入的、個(gè)數(shù)nmemb
size_t my_fwrite(const void* ptr,size_t size,size_t nmemb,MY_FILE* stream)
{
  //1、緩沖區(qū)如果已經(jīng)滿了,就直接寫(xiě)入
  if(stream->current == NUM)my_fflush(stream);

  //2.根據(jù)緩沖區(qū)剩余情況,進(jìn)行數(shù)據(jù)拷貝即可
  size_t user_size = size * nmemb;
  size_t my_size = NUM - stream->current;

  size_t write = 0;
  if(my_size >= user_size) 
  {
    memcpy(stream->outputbuffer + stream->current,ptr,user_size);
   //3.更新計(jì)數(shù)器字段
    stream->current += user_size;
    write = user_size;
  }
  else 
  {
    //如果緩沖區(qū)內(nèi)存不夠存放的話,指揮存放它的最大值
    memcpy(stream->outputbuffer+stream->current,ptr,my_size);
    stream->current += my_size;
    write = my_size;
  }
  //4.開(kāi)始計(jì)劃刷新,他們高效體現(xiàn)在哪里? --- TODO
  //不發(fā)生刷新的本質(zhì),不進(jìn)行寫(xiě)入,就是不進(jìn)行IO,不進(jìn)行調(diào)用系統(tǒng)調(diào)用,所以my_fwrite函數(shù)調(diào)用會(huì)非??欤瑪?shù)據(jù)會(huì)暫時(shí)保存在緩沖區(qū)中
  //可以在緩沖區(qū)中擠壓多份數(shù)據(jù),統(tǒng)一進(jìn)行刷新寫(xiě)入,本質(zhì):就是一次IO可以IO更多的數(shù)據(jù),提高IO效率
  if(stream->flags & BUFF_ALL)
  {
    if(stream->current == NUM) my_fflush(stream);
  }
  else if(stream->flags & BUFF_LINE)
  {
    if(stream->outputbuffer[stream->current-1] =='\n')
    {
      my_fflush(stream);
    }
  }
  else 
  {
    //TODO
  }
  return write;
}


int my_fclose(MY_FILE* fp)
{
  assert(fp);
  //1.沖刷緩沖區(qū)
  if(fp->current > 0) my_fflush(fp);

  //2.關(guān)閉文件
  close(fp->fd);

  //3.釋放堆空間
  free(fp);

  //4.指針置NULL --- 可以設(shè)置
  fp = NULL;

  return 0;
}
main.c
#include "mystdio.h"
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#define MYFILE "log.text"
int main()
{
  MY_FILE* fp = my_fopen(MYFILE,"w");
  if(fp == NULL) return 1;

  const char* str = "hello my my_fwrite";
  int cnt = 10;
  //操作文件
  while(cnt)
  {
    char buffer[1024];
    snprintf(buffer,sizeof(buffer),"%s:%d\n",str,cnt--);
    size_t size = my_fwrite(buffer,strlen(buffer),1,fp);
    sleep(1);
    printf("當(dāng)前成功寫(xiě)入:%lu個(gè)字節(jié)\n",size);
  }
    my_fclose(fp);

    return 0;
}

如何強(qiáng)制刷新內(nèi)核緩沖區(qū)

根據(jù)文件描述符進(jìn)行強(qiáng)制刷新

main.c
#include "mystdio.h"
#include <string.h>
#include <unistd.h>
#include <stdio.h>
#define MYFILE "log.text"
int main()
{
  MY_FILE* fp = my_fopen(MYFILE,"w");
  if(fp == NULL) return 1;

  const char* str = "hello my my_fwrite";
  int cnt = 10;
  //操作文件
  while(cnt)
  {
    char buffer[1024];
    snprintf(buffer,sizeof(buffer),"%s:%d\n",str,cnt--);
    if(cnt % 5 == 0)
    {
    	//當(dāng)cnt是五的倍數(shù)的時(shí)候就會(huì)強(qiáng)制刷新一次
    	my_fwrite(buffer,strlen(buffer),1,fp);
    }
  }
    my_fclose(fp);

    return 0;
}

【Linux】模擬實(shí)現(xiàn)FILE以及認(rèn)識(shí)緩沖區(qū),Linux,leetcode,linux,算法

例子

像我們進(jìn)行scanf輸入的時(shí)候,其實(shí)本身我們輸入的是一串字符串,將這個(gè)字符串讀入對(duì)應(yīng)的緩沖區(qū)buff后,然后通過(guò)分解工作,進(jìn)一步傳入系統(tǒng),系統(tǒng),系統(tǒng)在通過(guò)一些指令輸入輸出想要的結(jié)果文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-685318.html

到了這里,關(guān)于【Linux】模擬實(shí)現(xiàn)FILE以及認(rèn)識(shí)緩沖區(qū)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【linux深入剖析】文件描述符 | 對(duì)比 fd 和 FILE | 緩沖區(qū)

    【linux深入剖析】文件描述符 | 對(duì)比 fd 和 FILE | 緩沖區(qū)

    ??你好,我是 RO-BERRY ?? 致力于C、C++、數(shù)據(jù)結(jié)構(gòu)、TCP/IP、數(shù)據(jù)庫(kù)等等一系列知識(shí) ??感謝你的陪伴與支持 ,故事既有了開(kāi)頭,就要畫(huà)上一個(gè)完美的句號(hào),讓我們一起加油 通過(guò)對(duì)open函數(shù)的學(xué)習(xí),我們知道了文件描述符就是一個(gè)小整數(shù) 而現(xiàn)在知道,文件描述符就是從0開(kāi)始的小

    2024年04月13日
    瀏覽(31)
  • (9)Linux Git的介紹以及緩沖區(qū)

    (9)Linux Git的介紹以及緩沖區(qū)

    ?? 前言 本章我們先對(duì)緩沖區(qū)的概念進(jìn)行一個(gè)詳細(xì)的探究,之后會(huì)帶著大家一步步去編寫(xiě)一個(gè)簡(jiǎn)陋的?\\\"進(jìn)度條\\\" 小程序。最后我們來(lái)介紹一下 Git,著重講解一下 Git 三板斧,一般只要掌握三板斧就基本夠用了。 先說(shuō)一下?unistd.h 庫(kù)中的 sleep 函數(shù),它可以按照秒去休眠 我們先創(chuàng)

    2024年02月03日
    瀏覽(22)
  • 【linux基礎(chǔ)I/O(二)】文件系統(tǒng)講解以及文件緩沖區(qū)的概念

    【linux基礎(chǔ)I/O(二)】文件系統(tǒng)講解以及文件緩沖區(qū)的概念

    ??博主CSDN主頁(yè):杭電碼農(nóng)-NEO?? ? ?專欄分類:Linux從入門(mén)到精通? ? ??代碼倉(cāng)庫(kù):NEO的學(xué)習(xí)日記?? ? ??關(guān)注我??帶你學(xué)更多操作系統(tǒng)知識(shí) ? ???? 對(duì)于文件來(lái)講,有打開(kāi)的在內(nèi)存中 的文件,也有沒(méi)有打開(kāi)的在磁盤(pán)上 文件,上一篇文章講解的是前者,本篇 文章將帶大家了解后

    2024年01月19日
    瀏覽(33)
  • 【看表情包學(xué)Linux】緩沖區(qū)的概念 | Git 三板斧 | 實(shí)現(xiàn)簡(jiǎn)易進(jìn)度條

    【看表情包學(xué)Linux】緩沖區(qū)的概念 | Git 三板斧 | 實(shí)現(xiàn)簡(jiǎn)易進(jìn)度條

    ?? 爆笑教程,只送有緣人 ????《看表情包學(xué)Linux》 ?? 寫(xiě)在前面: 本章我們先對(duì)緩沖區(qū)的概念進(jìn)行一個(gè)詳細(xì)的探究,之后會(huì)帶著大家一步步去編寫(xiě)一個(gè)簡(jiǎn)陋的?\\\"進(jìn)度條\\\" 小程序,過(guò)程還是挺有意思的,雖然實(shí)現(xiàn)的過(guò)程表現(xiàn)得非常沙雕,但它是本 Linux 專欄中第一個(gè)小程序。

    2024年02月02日
    瀏覽(20)
  • 【Linux】文件緩沖區(qū)

    【Linux】文件緩沖區(qū)

    提到文件緩沖區(qū)這個(gè)概念我們好像并不陌生,但是我們對(duì)于這個(gè)概念好像又是模糊的存在腦海中,之間我們?cè)诮榻Bc語(yǔ)言文件操作已經(jīng)簡(jiǎn)單的提過(guò)這個(gè)概念,今天我們不妨深入理解什么是文件緩沖區(qū) 通過(guò)自己實(shí)現(xiàn)庫(kù)中的一些文件操作函數(shù)更加深入的理解文件緩沖區(qū) 自定義實(shí)現(xiàn)

    2024年02月10日
    瀏覽(25)
  • 【Linux】理解緩沖區(qū)

    【Linux】理解緩沖區(qū)

    我們發(fā)現(xiàn) printf 和 fwrite (庫(kù)函數(shù))都輸出了2次,而 write 只輸出了一次(系統(tǒng)調(diào)用)。為什么呢?肯定和fork有關(guān)! C接口的函數(shù)被打印了兩次系統(tǒng)接口前后只是打印了一次:和fork函數(shù)有關(guān),fork會(huì)創(chuàng)建子進(jìn)程。在創(chuàng)建子進(jìn)程的時(shí)候,數(shù)據(jù)會(huì)被處理成兩份,父子進(jìn)程發(fā)生寫(xiě)時(shí)拷

    2024年01月23日
    瀏覽(20)
  • 【linux】重定向+緩沖區(qū)

    【linux】重定向+緩沖區(qū)

    自我名言 : 只有努力,才能追逐夢(mèng)想,只有努力,才不會(huì)欺騙自己。 喜歡的點(diǎn)贊,收藏,關(guān)注一下把! close(1),為什么沒(méi)有打印新建文件fd呢? printf(“%dn”,fd); printf會(huì)把內(nèi)容打印到stdout文件中。 但是close(1)關(guān)閉標(biāo)準(zhǔn)輸出stdout—顯示器,int fd=open();新打開(kāi)的文件fd是1。 st

    2024年02月08日
    瀏覽(22)
  • 【Linux】深入理解緩沖區(qū)

    【Linux】深入理解緩沖區(qū)

    目錄 什么是緩沖區(qū) 為什么要有緩沖區(qū) 緩沖區(qū)刷新策略 緩沖區(qū)在哪里 ?手動(dòng)設(shè)計(jì)一個(gè)用戶層緩沖區(qū) 緩沖區(qū)本質(zhì)上一塊內(nèi)存區(qū)域,用來(lái)保存臨時(shí)數(shù)據(jù)。 緩沖區(qū)在各種計(jì)算任務(wù)中都廣泛應(yīng)用,包括輸入/輸出操作、網(wǎng)絡(luò)通信、圖像處理、音頻處理等。 這塊內(nèi)存區(qū)域是由 誰(shuí)提供的

    2024年02月15日
    瀏覽(22)
  • Linux之緩沖區(qū)的理解

    Linux之緩沖區(qū)的理解

    目錄 一、問(wèn)題引入 二、緩沖區(qū) 1、什么是緩沖區(qū) 2、刷新策略 3、緩沖區(qū)由誰(shuí)提供 4、重看問(wèn)題 三、緩沖區(qū)的簡(jiǎn)單實(shí)現(xiàn) 我們先來(lái)看看下面的代碼:我們使用了C語(yǔ)言接口和系統(tǒng)調(diào)用接口來(lái)進(jìn)行文件操作。在代碼的最后,我們還使用fork函數(shù)創(chuàng)建了一個(gè)子進(jìn)程。 ?代碼運(yùn)行結(jié)果如

    2024年02月03日
    瀏覽(24)
  • 【Linux】深入理解文件緩沖區(qū)

    【Linux】深入理解文件緩沖區(qū)

    問(wèn)題引入 首先看一段代碼: 運(yùn)行代碼,結(jié)果如下: 如果此時(shí)將輸出結(jié)果重定向一下: 會(huì)發(fā)現(xiàn) printf 、 fwrite 都打印了兩次。 究其原因,就要談到緩沖區(qū)和緩沖區(qū)刷新策略的概念了。 如何理解緩沖區(qū) 假設(shè)你在青島,你要從網(wǎng)上買一件商品,商家所在地是北京。你不會(huì)跑去北

    2024年02月11日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包