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

Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn)

這篇具有很好參考價(jià)值的文章主要介紹了Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一.緩沖區(qū)的概念和作用

Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn),Linux學(xué)習(xí)之路,linux,緩沖區(qū),C語言文件庫

二.一個(gè)樣例

Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn),Linux學(xué)習(xí)之路,linux,緩沖區(qū),C語言文件庫
Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn),Linux學(xué)習(xí)之路,linux,緩沖區(qū),C語言文件庫

三.理解樣例

1.樣例解釋

Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn),Linux學(xué)習(xí)之路,linux,緩沖區(qū),C語言文件庫
Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn),Linux學(xué)習(xí)之路,linux,緩沖區(qū),C語言文件庫

2.什么是刷新?

Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn),Linux學(xué)習(xí)之路,linux,緩沖區(qū),C語言文件庫

四.簡(jiǎn)易模擬實(shí)現(xiàn)C標(biāo)準(zhǔn)庫

至此,我們理解了緩沖區(qū)的概念和作用,下面我們來簡(jiǎn)易模擬實(shí)現(xiàn)一下C標(biāo)準(zhǔn)庫

1.我們要實(shí)現(xiàn)的大致框架

我們要實(shí)現(xiàn)的是:
Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn),Linux學(xué)習(xí)之路,linux,緩沖區(qū),C語言文件庫

2.mylib.h的實(shí)現(xiàn)

1.文件結(jié)構(gòu)體的定義

1.首先要有一個(gè)文件結(jié)構(gòu)體:

結(jié)構(gòu)體當(dāng)中
1.要封裝文件描述符fd    設(shè)置成員變量fileno
2.用戶級(jí)緩沖區(qū)buffer     大小宏定義為SIZE 4096
3.該文件所對(duì)應(yīng)緩沖區(qū)的刷新策略 flag

刷新策略分別宏定義為

#define FLUSH_NONE 1        不刷新
#define FLUSH_LINE (1<<1)   行刷新
#define FLUSH_ALL (1<<2)    全刷新
4.緩沖區(qū)中有效數(shù)據(jù)的個(gè)數(shù)  end
#define SIZE 4096

#define FLUSH_NONE 1
#define FLUSH_LINE (1<<1)
#define FLUSH_ALL (1<<2)

typedef struct my_file
{
    int fileno;
    char buffer[SIZE];
    int end;//緩沖區(qū)中有效數(shù)據(jù)的個(gè)數(shù)(也就是最后一個(gè)有效數(shù)據(jù)的下一個(gè)位置)
    int flag;//緩沖區(qū)的刷新策略
}my_file;

2.myfopen等等函數(shù)的聲明

Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn),Linux學(xué)習(xí)之路,linux,緩沖區(qū),C語言文件庫

1.myfopen:以mode的方式打開path這個(gè)文件

path:文件路徑+文件名
mode:打開文件的方式
“r”:只讀
“w”:覆蓋寫
“a”:追加寫

2.myfwrite當(dāng)中:把s字符串中前num個(gè)數(shù)據(jù)寫入stream文件中

stream:要往哪個(gè)文件當(dāng)中寫入數(shù)據(jù),stream是對(duì)應(yīng)文件的結(jié)構(gòu)體指針
s:有數(shù)據(jù)的字符串
num:要寫入的數(shù)據(jù)個(gè)數(shù)

3.myfflush:刷新文件緩沖區(qū)
4.myfclose:關(guān)閉該文件

3.完整mylib.h代碼

DFL_MODE : 打開文件的默認(rèn)權(quán)限
Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn),Linux學(xué)習(xí)之路,linux,緩沖區(qū),C語言文件庫

3.myfopen函數(shù)的實(shí)現(xiàn)

Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn),Linux學(xué)習(xí)之路,linux,緩沖區(qū),C語言文件庫

my_file* myfopen(const char* path,const char* mode)
{
    int fd=0;
    int flag=0;
    if(strcmp(mode,"r")==0)
    {
        flag |= O_RDONLY;
    }
    else if(strcmp(mode,"w")==0)
    {
        flag |= (O_WRONLY | O_CREAT | O_TRUNC);
    }
    else if(strcmp(mode,"a")==0)
    {
        flag |= (O_WRONLY | O_CREAT | O_APPEND);
    }
    if(flag & O_CREAT)
    {
        fd=open(path,flag,DFL_MODE);
    }
    else
    {
        fd=open(path,flag);
    }
    //打開文件失敗,設(shè)置errno錯(cuò)誤碼并返回NULL
    if(fd==-1)
    {
        errno=2;
        return NULL;
    }
    //創(chuàng)建文件,設(shè)置fp的相應(yīng)屬性
    my_file* fp=(my_file*)malloc(sizeof(my_file));
    if(fp==NULL)
    {
        errno=3;
        return NULL;
    }
    fp->fileno=fd;
    fp->flag=FLUSH_LINE;
    fp->end=0;
    return fp;
}

4.myfwrite函數(shù)的實(shí)現(xiàn)

Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn),Linux學(xué)習(xí)之路,linux,緩沖區(qū),C語言文件庫

//把s中的數(shù)據(jù)寫入stream中
int myfwrite(const char* s,int num,my_file* stream)
{
    //保存舊的緩沖區(qū)的大小
    int pos=stream->end;
    //1.先寫入用戶級(jí)緩沖區(qū)
    memcpy(stream->buffer+pos,s,num);
    stream->end += num;//更新緩沖區(qū)大小
    
    //刷新策略:按行刷新
    if(stream->flag & FLUSH_LINE)
    {
        //2.判斷是否需要刷新緩沖區(qū)(判斷是否有'\n')
        int flushit=0;
        while(pos < stream->end)
        {
            if((stream->buffer[pos])=='\n')
            {
                flushit=1;
                break;
            }
            pos++;
        }

        if(flushit == 1)
        {
            //3.刷新緩沖區(qū):[0,pos]數(shù)據(jù)
            write(stream->fileno,stream->buffer,pos+1);
            //4.更新緩沖區(qū) 把[pos+1,count)的數(shù)據(jù)移動(dòng)到[0,count-pos-2]當(dāng)中
            //一共移動(dòng)count-pos-1個(gè)數(shù)據(jù)
            //先求出要移動(dòng)的最后一個(gè)數(shù)據(jù)的下標(biāo)
            int count=stream->end;
            memmove(stream->buffer,stream->buffer+pos+1,count-pos-1);
            stream->buffer[count-pos-1]='\0';
            stream->end=count-pos-1;
        }
    }
    return num;
}

5.myfflush函數(shù)的實(shí)現(xiàn)

Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn),Linux學(xué)習(xí)之路,linux,緩沖區(qū),C語言文件庫

int myfflush(my_file* fp)
{
    if(fp->end > 0)
    {
        write(fp->fileno,fp->buffer,fp->end);
        fp->end=0;
    }
    return 0;
}

6.myfclose函數(shù)的實(shí)現(xiàn)

Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn),Linux學(xué)習(xí)之路,linux,緩沖區(qū),C語言文件庫

int myfclose(my_file* fp)
{
    myfflush(fp);
    return close(fp->fileno);
}

7.演示

下面我們測(cè)試一下
Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn),Linux學(xué)習(xí)之路,linux,緩沖區(qū),C語言文件庫
Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn),Linux學(xué)習(xí)之路,linux,緩沖區(qū),C語言文件庫
Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn),Linux學(xué)習(xí)之路,linux,緩沖區(qū),C語言文件庫
跟我們所預(yù)想的一樣

8.完整代碼

1.mylib.h

#pragma once
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <stdlib.h>
#include <unistd.h>

#define SIZE 4096
#define DFL_MODE 0666

#define FLUSH_NONE 1
#define FLUSH_LINE (1<<1)
#define FLUSH_ALL (1<<2)

typedef struct my_file
{
    int fileno;
    char buffer[SIZE];
    int end;//緩沖區(qū)中有效數(shù)據(jù)的個(gè)數(shù)(也就是最后一個(gè)有效數(shù)據(jù)的下一個(gè)位置)
    int flag;//緩沖區(qū)的刷新策略
}my_file;

my_file* myfopen(const char* path,const char* mode);

int myfwrite(const char* s,int num,my_file* stream);

int myfflush(my_file* fp);

int myfclose(my_file* fp);

2.mylib.c

#include "mylib.h"

my_file* myfopen(const char* path,const char* mode)
{
    int fd=0;
    int flag=0;
    if(strcmp(mode,"r")==0)
    {
        flag |= O_RDONLY;
    }
    else if(strcmp(mode,"w")==0)
    {
        flag |= (O_WRONLY | O_CREAT | O_TRUNC);
    }
    else if(strcmp(mode,"a")==0)
    {
        flag |= (O_WRONLY | O_CREAT | O_APPEND);
    }
    if(flag & O_CREAT)
    {
        fd=open(path,flag,DFL_MODE);
    }
    else
    {
        fd=open(path,flag);
    }
    //打開文件失敗,設(shè)置errno錯(cuò)誤碼并返回NULL
    if(fd==-1)
    {
        errno=2;
        return NULL;
    }
    //創(chuàng)建文件,設(shè)置fp的相應(yīng)屬性
    my_file* fp=(my_file*)malloc(sizeof(my_file));
    if(fp==NULL)
    {
        errno=3;
        return NULL;
    }
    fp->fileno=fd;
    fp->flag=FLUSH_LINE;
    fp->end=0;
    return fp;
}


//把s中的數(shù)據(jù)寫入stream中
int myfwrite(const char* s,int num,my_file* stream)
{
    //保存舊的緩沖區(qū)的大小
    int pos=stream->end;
    //1.先寫入用戶級(jí)緩沖區(qū)
    memcpy(stream->buffer+pos,s,num);
    stream->end += num;//更新緩沖區(qū)大小
    
    //刷新策略:按行刷新
    if(stream->flag & FLUSH_LINE)
    {
        //2.判斷是否需要刷新緩沖區(qū)(判斷是否有'\n')
        int flushit=0;
        while(pos < stream->end)
        {
            if((stream->buffer[pos])=='\n')
            {
                flushit=1;
                break;
            }
            pos++;
        }

        if(flushit == 1)
        {
            //3.刷新緩沖區(qū):[0,pos]數(shù)據(jù)
            write(stream->fileno,stream->buffer,pos+1);
            //4.更新緩沖區(qū) 把[pos+1,count)的數(shù)據(jù)移動(dòng)到[0,count-pos-2]當(dāng)中
            //一共移動(dòng)count-pos-1個(gè)數(shù)據(jù)
            //先求出要移動(dòng)的最后一個(gè)數(shù)據(jù)的下標(biāo)
            int count=stream->end;
            memmove(stream->buffer,stream->buffer+pos+1,count-pos-1);
            stream->buffer[count-pos-1]='\0';
            stream->end=count-pos-1;
        }
    }
    return num;
}

int myfflush(my_file* fp)
{
    if(fp->end > 0)
    {
        write(fp->fileno,fp->buffer,fp->end);
        fp->end=0;
    }
    return 0;
}

int myfclose(my_file* fp)
{
    myfflush(fp);
    return close(fp->fileno);
}

3.main.c

#include "mylib.h"
int main()
{
    my_file* fp=myfopen("./log.txt","a");
    if(fp==NULL)
    {
        perror("myfopen fail");
        return 1;
    }
    int cnt=10;
    
    const char* message="abc\ndef";
    while(cnt--)
    {
        mywrite(message,strlen(message),fp);
        sleep(1);
    }
    myfclose(fp);
    return 0;
}

以上就是Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn)的全部?jī)?nèi)容,希望能對(duì)大家有所幫助!文章來源地址http://www.zghlxwxcb.cn/news/detail-838579.html

到了這里,關(guān)于Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫的簡(jiǎn)單模擬實(shí)現(xiàn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(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)文章

  • 【玩轉(zhuǎn)Linux】標(biāo)準(zhǔn)io緩沖區(qū)的操作

    【玩轉(zhuǎn)Linux】標(biāo)準(zhǔn)io緩沖區(qū)的操作

    (??? ),hello我是 祐言 博客主頁:C語言基礎(chǔ),Linux基礎(chǔ),軟件配置領(lǐng)域博主?? 快上??,一起學(xué)習(xí)! 送給讀者的一句雞湯??: 集中起來的意志可以擊穿頑石! 作者水平很有限,如果發(fā)現(xiàn)錯(cuò)誤,可在評(píng)論區(qū)指正,感謝?? ????????標(biāo)準(zhǔn)I/O緩沖區(qū)是用于提高I/O性能的一種機(jī)制,

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

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

    我們發(fā)現(xiàn) printf 和 fwrite (庫函數(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ā)生寫時(shí)拷

    2024年01月23日
    瀏覽(19)
  • 【看表情包學(xué)Linux】文件描述符 | 重定向 Redirection | dup2 函數(shù) | 緩沖區(qū)的理解 (Cache)

    【看表情包學(xué)Linux】文件描述符 | 重定向 Redirection | dup2 函數(shù) | 緩沖區(qū)的理解 (Cache)

    ?? ??? 爆笑 教程 ????《看表情包學(xué)Linux》?? ? 猛戳訂閱 ? ? ?? ?? 寫在前面: 在上一章中,我們已經(jīng)把 fd 的基本原理搞清楚了。本章我們將開始探索 fd 的應(yīng)用特征,探索 文件描述符的分配原則。講解重定向,上一章是如何使用 fflush 把內(nèi)容變出來的,介紹 dup2 函數(shù),

    2023年04月25日
    瀏覽(19)
  • Linux之緩沖區(qū)的理解

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

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

    2024年02月03日
    瀏覽(24)
  • 【Linux】基礎(chǔ)IO----理解緩沖區(qū)

    【Linux】基礎(chǔ)IO----理解緩沖區(qū)

    作者:?舊言~ 座右銘:松樹千年終是朽,槿花一日自為榮。 目標(biāo):理解緩沖區(qū) 毒雞湯:有些事情,總是不明白,所以我不會(huì)堅(jiān)持。早安! 專欄選自:Linux初階 望小伙伴們點(diǎn)贊??收藏?加關(guān)注喲???? 緩沖區(qū)大家其實(shí)不陌生,像我們使用的 VS2019 編譯器這里就有緩沖區(qū),那它

    2024年04月13日
    瀏覽(21)
  • 用Linux的視角來理解緩沖區(qū)概念

    用Linux的視角來理解緩沖區(qū)概念

    緩沖區(qū)(buffer)是存儲(chǔ)數(shù)據(jù)的臨時(shí)存儲(chǔ)區(qū)域。當(dāng)我們用C語言向文件中寫入數(shù)據(jù)時(shí),數(shù)據(jù)并不會(huì)直接的寫到文件中,中途還經(jīng)過了緩沖區(qū),而我們需要對(duì)緩沖區(qū)的數(shù)據(jù)進(jìn)行刷新,那么數(shù)據(jù)才算寫到文件當(dāng)中。而緩沖區(qū)通常是一塊內(nèi)存區(qū)域,可以是數(shù)組、隊(duì)列、鏈表等數(shù)據(jù)結(jié)構(gòu)。

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

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

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

    2024年02月10日
    瀏覽(25)
  • 【Linux】天天直接IO?我說停停,不如試試文件緩沖區(qū)

    【Linux】天天直接IO?我說停停,不如試試文件緩沖區(qū)

    收錄于【Linux】文件系統(tǒng)?專欄 關(guān)于文件描述符與文件重定向的相關(guān)內(nèi)容可以移步?文件描述符與重定向操作。 可以到?淺談文件原理與操作?了解文件操作的系統(tǒng)接口。 目錄 系列文章 揭秘C庫文件結(jié)構(gòu)體? 文件緩沖區(qū) 為什么需要文件緩沖區(qū) 刷新機(jī)制 內(nèi)核文件緩沖區(qū) 模擬實(shí)

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

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

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

    2024年01月19日
    瀏覽(33)
  • 理解緩沖區(qū)

    理解緩沖區(qū)

    對(duì)于這樣的代碼,首先可以肯定的是 printf 語句先于 sleep 執(zhí)行,既然如此那么就應(yīng)該是先打印語句然后進(jìn)行休眠,下面看看結(jié)果: 但這里卻是先休眠以后再打印語句,這是因?yàn)榇嬖谝粋€(gè)叫緩沖區(qū)的東西,當(dāng)我們要向外設(shè)寫入數(shù)據(jù)(讓顯示器顯示就是向顯示器寫入數(shù)據(jù))時(shí)會(huì)將

    2023年04月25日
    瀏覽(22)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包