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

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

這篇具有很好參考價(jià)值的文章主要介紹了用Linux的視角來(lái)理解緩沖區(qū)概念。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

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

緩沖區(qū)的認(rèn)識(shí)

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

代碼舉例

int main()
{
    //C接口
    FILE* fp=fopen("log.txt","w");//創(chuàng)建文件
    const char* buffer = "hello buffer\n"; 
    fwrite(buffer,strlen(buffer),1,fp);//文件寫入
    
    //系統(tǒng)接口
    close(fp->_fileno);

    return 0;
}

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

此時(shí)的數(shù)據(jù)其實(shí)就是寫進(jìn)了緩沖區(qū)中,但是我們此時(shí)的調(diào)用接口是不一樣的,關(guān)閉文件調(diào)用的是系統(tǒng)調(diào)用接口,而且FILE結(jié)構(gòu)體中是封裝了文件描述符的。先認(rèn)識(shí)后續(xù)會(huì)講述原因。


其實(shí)我們是可以將我們緩沖區(qū)中的數(shù)據(jù)給刷新出來(lái):

int main()
{
    FILE* fp=fopen("log.txt","w");
    const char* buffer = "hello buffer\n"; 
    fwrite(buffer,strlen(buffer),1,fp);

    fflush(fp);//刷新緩沖區(qū)

    close(fp->_fileno);

    return 0;
}

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

?為什么要有緩沖區(qū)的存在

其實(shí)緩沖區(qū)的存在就是為了減少對(duì)數(shù)據(jù)的訪問(wèn)次數(shù),當(dāng)我們輸入輸出數(shù)據(jù)的時(shí)候,其實(shí)就是對(duì)文件信息進(jìn)行交互的(一切皆文件)。我們?yōu)榱吮苊饷恳淮蔚奈募L問(wèn)IO操作,從而會(huì)降低效率,所以說(shuō)可以建立一個(gè)像緩沖區(qū)這樣的中轉(zhuǎn)站,將數(shù)據(jù)與緩沖區(qū)交互,然后將所有的數(shù)據(jù)都接收處理好了以后再交給文件。

緩沖區(qū)的刷新方式

  1. 立即刷新(無(wú)緩沖)
  2. 行刷新(行緩沖)
  3. 緩沖區(qū)滿了刷新(全緩沖)
  4. 強(qiáng)制刷新

一般對(duì)于顯示器文件的刷新方式是行刷新(\n也是進(jìn)行行刷新),而一般磁盤上的文件的刷新方式就是緩沖區(qū)滿了再刷新。?我們也可以通過(guò)fflush函數(shù)強(qiáng)制的進(jìn)行刷新緩沖區(qū)。而且進(jìn)程退出后都會(huì)采取強(qiáng)制刷新,但是此時(shí)如果文件已經(jīng)close的話(底層fd沒(méi)了),數(shù)據(jù)依舊刷不進(jìn)去的。


此時(shí)就可以淺淺的解釋我們開(kāi)始寫的代碼的,因?yàn)槲覀兊囊话阄募乃⑿虏呗允蔷彌_區(qū)滿了才刷新的,這正是因?yàn)槲覀兿騦og.txt這個(gè)文件里寫的數(shù)據(jù)沒(méi)有寫滿緩沖區(qū),所以導(dǎo)致緩沖區(qū)沒(méi)有刷新,從而該文件中并沒(méi)有數(shù)據(jù)。其實(shí)如果你多寫一些數(shù)據(jù)進(jìn)去的話其實(shí)是可以寫滿的。

緩沖區(qū)與操作系統(tǒng)無(wú)關(guān)

?結(jié)論我們寫代碼時(shí)的緩沖區(qū)其實(shí)是屬于C語(yǔ)言的,與操作系統(tǒng)并無(wú)關(guān)系。


int main()
{

    FILE* fp=fopen("log.txt","w");
    const char* buffer = "helllo buffer\n"; 
    fwrite(buffer,strlen(buffer),1,fp);
    fclose(fp);//C語(yǔ)言接口

    return 0;
}

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

?該段代碼的區(qū)別就是用了C語(yǔ)言接口關(guān)閉文件。而我們開(kāi)頭的那段代碼是系統(tǒng)調(diào)用關(guān)閉文件。僅僅換了一種關(guān)閉方式就導(dǎo)致了文件中一個(gè)有數(shù)據(jù)一個(gè)沒(méi)數(shù)據(jù)。所以說(shuō)可以知道,C語(yǔ)言中的fclose其實(shí)是封裝了系統(tǒng)調(diào)用的close,但是還多了一個(gè)步驟:刷新緩沖區(qū)。

也可以說(shuō)明系統(tǒng)調(diào)用接口其實(shí)是沒(méi)有緩沖區(qū)這個(gè)概念的,緩沖區(qū)其實(shí)是我們C語(yǔ)言庫(kù)中后期封裝好的。

?經(jīng)典樣例

代碼一:

int main()
{
    printf("C:printf\n");
    fprintf(stdout,"C:fprintf\n");
    fputs("C:fputs\n",stdout);
    
    const char* arr = "system:write\n";
    write(1,arr,strlen(arr));

    return 0;
}

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


代碼二:

int main()
{
    printf("C:printf\n");
    fprintf(stdout,"C:fprintf\n");
    fputs("C:fputs\n",stdout);
    
    const char* arr = "system:write\n";
    write(1,arr,strlen(arr));

    fork();//創(chuàng)建子進(jìn)程

    return 0;
}

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


就上面的兩段代碼唯一的區(qū)別就是在程序結(jié)束之前是否創(chuàng)建了子進(jìn)程。

現(xiàn)象就是:代碼一沒(méi)有創(chuàng)建子進(jìn)程,而且就如我們意想的結(jié)果一樣正常打印數(shù)據(jù)到log.txt文件當(dāng)中,而代碼二在打印結(jié)束的時(shí)候創(chuàng)建了子進(jìn)程,最終log.txt文件中的數(shù)據(jù)打印了兩份,除了系統(tǒng)調(diào)用write函數(shù)之外。

其實(shí)在我們./test.exe > log.txt 將本應(yīng)該打印到顯示器文件的數(shù)據(jù)重定向到log.txt文件當(dāng)中時(shí),就改變了緩沖區(qū)的刷新策略,從原先的行數(shù)新變成了緩沖區(qū)滿了再刷新。所以在執(zhí)行fork函數(shù)創(chuàng)建子進(jìn)程之前的所有數(shù)據(jù)依舊還是存在緩沖區(qū)當(dāng)中,而創(chuàng)建子進(jìn)程后,父子進(jìn)程代碼共享,數(shù)據(jù)采用寫時(shí)拷貝的方式存在著。當(dāng)假設(shè)父進(jìn)程先結(jié)束退出以后,此時(shí)父進(jìn)程的緩沖區(qū)就會(huì)被強(qiáng)制刷新(也就是相當(dāng)于清空緩沖區(qū)數(shù)據(jù)),而此時(shí)的子進(jìn)程必然是會(huì)發(fā)生寫時(shí)拷貝,數(shù)據(jù)獨(dú)有一份,所以最終子進(jìn)程退出時(shí)緩沖區(qū)的數(shù)據(jù)也會(huì)被強(qiáng)制刷新,所以最終數(shù)據(jù)就有兩份了。

而針對(duì)于系統(tǒng)調(diào)用write函數(shù)并不是將數(shù)據(jù)寫進(jìn)緩沖區(qū)當(dāng)中,而是直接寫到操作系統(tǒng)中,因此以上操作就與該函數(shù)無(wú)關(guān)。

緩沖區(qū)在哪里??

我們知道緩沖區(qū)與操作系統(tǒng)無(wú)關(guān),所以緩沖區(qū)在哪里呢,其實(shí)就在FILE的結(jié)構(gòu)體中。

就那我們比較熟悉的函數(shù)fflush,該函數(shù)的作用是刷新緩沖區(qū),而參數(shù)就是FILE*的文件指針,所以此時(shí)其實(shí)就可以看出端倪了。

FILE其實(shí)是一個(gè)結(jié)構(gòu)體,我們前面知道FILE結(jié)構(gòu)體當(dāng)中封裝了文件描述符,其實(shí)也有緩沖區(qū),其實(shí)就是一些指針。用Linux的視角來(lái)理解緩沖區(qū)概念,Linux,Linux,緩沖區(qū)


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

?????????文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-809141.html

到了這里,關(guān)于用Linux的視角來(lái)理解緩沖區(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】基礎(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基礎(chǔ)I/O(二)】文件系統(tǒng)講解以及文件緩沖區(qū)的概念

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

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

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

    2024年02月02日
    瀏覽(19)
  • Linux文件系列: 深入理解緩沖區(qū)和C標(biāo)準(zhǔn)庫(kù)的簡(jiǎn)單模擬實(shí)現(xiàn)

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

    至此,我們理解了緩沖區(qū)的概念和作用,下面我們來(lái)簡(jiǎn)易模擬實(shí)現(xiàn)一下C標(biāo)準(zhǔn)庫(kù) 我們要實(shí)現(xiàn)的是: 1.文件結(jié)構(gòu)體的定義 1.首先要有一個(gè)文件結(jié)構(gòu)體: 刷新策略分別宏定義為 2.myfopen等等函數(shù)的聲明 path:文件路徑+文件名 mode:打開(kāi)文件的方式 “r”:只讀 “w”:覆蓋寫 “a”:追加寫 strea

    2024年03月11日
    瀏覽(18)
  • [Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用!(緩沖區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù))

    [Linux]理解文件系統(tǒng)!動(dòng)靜態(tài)庫(kù)詳細(xì)制作使用!(緩沖區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù))

    ? ? ? ? hello,大家好,這里是bang___bang_,今天來(lái)談?wù)劦奈募到y(tǒng)知識(shí),包含有緩沖區(qū)、inode、軟硬鏈接、動(dòng)靜態(tài)庫(kù)。本篇旨在分享記錄知識(shí),如有需要,希望能有所幫助。 目錄 1??緩沖區(qū) ??緩沖區(qū)的意義 ??常見(jiàn)緩沖區(qū)刷新策略 ??緩沖區(qū)位置猜想 ??現(xiàn)象猜測(cè) ??現(xiàn)象解

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

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

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

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

    理解緩沖區(qū)

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

    2023年04月25日
    瀏覽(22)
  • 【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ū)

    自我名言 : 只有努力,才能追逐夢(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ū)的認(rèn)識(shí)!

    淺談linux緩沖區(qū)的認(rèn)識(shí)!

    今天來(lái)為大家分享一波關(guān)于緩沖區(qū)的知識(shí)!那么既然我們要談緩沖區(qū),那么就得從是什么?為什么?有什么作用這幾個(gè)方面來(lái)談?wù)撘幌戮彌_區(qū)!然后再通過(guò)一些代碼來(lái)更加深刻的理解緩沖區(qū)的知識(shí)! 從最簡(jiǎn)單的理解方面來(lái),我們可以將緩沖區(qū)理解成一塊內(nèi)存!那么這塊內(nèi)存是

    2024年02月05日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包