基礎(chǔ)IO——緩沖區(qū)-創(chuàng)新互聯(lián)

文章目錄
  • 1. 緩沖區(qū)理解
    • 1.1 緩沖區(qū)在哪里
    • 1.2 刷新策略
  • 2. 標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤
    • 2.1 模擬perror

創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括西秀網(wǎng)站建設(shè)、西秀網(wǎng)站制作、西秀網(wǎng)頁(yè)制作以及西秀網(wǎng)絡(luò)營(yíng)銷策劃等。多年來(lái),我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,西秀網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到西秀省份的部分城市,未來(lái)相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!1. 緩沖區(qū)理解

什么是緩沖區(qū)呢?
緩沖區(qū)的本質(zhì):就是一段內(nèi)存

為什么要有緩沖區(qū)呢?
大家在日常生活中,如果我們想寄東西給朋友,我們會(huì)先到快遞站去寄。如果沒(méi)有快遞站,我們自己去寄,那么就會(huì)耽誤自己的時(shí)間。那么這個(gè)緩沖區(qū)就相當(dāng)于快遞站,我們就相當(dāng)于進(jìn)程,你的朋友就是外設(shè)。緩沖區(qū)第一個(gè)作用:為了解放使用緩沖區(qū)的進(jìn)程的時(shí)間。

緩沖區(qū)第二個(gè)作用:可以集中處理數(shù)據(jù)刷新,減少IO的次數(shù),從而達(dá)到提高整機(jī)的效率的目的。

1.1 緩沖區(qū)在哪里

看下面的例子:
在這里插入圖片描述
運(yùn)行結(jié)果如下:
在這里插入圖片描述
然后我們?cè)倏催@樣的:
在這里插入圖片描述
運(yùn)行結(jié)果如下:
在這里插入圖片描述
在這里插入圖片描述

為什么會(huì)是這個(gè)現(xiàn)象,printf為什么一開(kāi)始不顯示了?
我們知道:printf里面的數(shù)據(jù)沒(méi)有立即打印出來(lái),是這些數(shù)據(jù)在緩沖區(qū)里了。
但是write是立即刷新了,printf沒(méi)有立即刷新。而printf里面是封裝了write,所以這個(gè)緩沖區(qū)一定不在write內(nèi)部,不是內(nèi)核級(jí)別的。那么這個(gè)緩沖區(qū)只能是C語(yǔ)言提供。

我們知道:在stdout中,它是FILE*的,所以是一個(gè)結(jié)構(gòu)體。它里面就封裝了語(yǔ)言級(jí)別的緩沖區(qū)。
在這里插入圖片描述
我們?cè)谑褂眠@些C庫(kù)里面的函數(shù)時(shí),首先并不是直接調(diào)用write函數(shù)。而是先存到FILE里的緩沖區(qū),然后當(dāng)這個(gè)緩沖區(qū)滿了的時(shí)候,再去調(diào)用write函數(shù)。

1.2 刷新策略

如果在刷新之前,關(guān)閉了fd會(huì)有什么問(wèn)題?
在這里插入圖片描述
我們把stdout里的fd關(guān)上,看一下運(yùn)行什么情況?
在這里插入圖片描述
這個(gè)情況就說(shuō)明了,我們?cè)谑褂肅庫(kù)里面的函數(shù)時(shí),并沒(méi)有及時(shí)調(diào)用write,而是先存到緩沖區(qū)里。我們把fd關(guān)上了,write就不能使用了,所以就不會(huì)刷新出來(lái)。

既然緩沖區(qū)在FILE內(nèi)部,在C語(yǔ)言中,每打開(kāi)一次文件,就會(huì)有一個(gè)FILE*返回。那就說(shuō)明,每一個(gè)文件都有一個(gè)fd和屬于它自己的語(yǔ)言級(jí)別的緩沖區(qū)。

刷新的幾種常見(jiàn)情況:
常規(guī):
1.無(wú)緩沖(立即刷新)。
2.行緩沖(逐行刷新),一般是顯示器文件。
3.全緩沖(緩沖區(qū)滿,刷新),一般是塊設(shè)備對(duì)應(yīng)的文件,也就是磁盤文件。

特殊:
1.進(jìn)程退出
2.用戶強(qiáng)制刷新

看下面的例子:
在這里插入圖片描述
在這里插入圖片描述
這里第一個(gè)很好解釋,write不用解釋了,因?yàn)樗苯铀⑿鲁鰜?lái)。而三個(gè)C庫(kù)函數(shù)是往顯示器打印,所以是行刷新,而這三個(gè)都帶了\n,所以直接刷新出來(lái)了。

第二個(gè)是什么情況呢?write不用解釋,直接刷新。但C庫(kù)函數(shù)都打印了兩次,是為什么?
因?yàn)槲覀冎囟ㄏ虻搅薼og.txt,是磁盤文件。所以是全刷新。所以這些C庫(kù)函數(shù)并沒(méi)有刷新,而是先保留在緩沖區(qū)里。然后fork之后,進(jìn)程結(jié)束,父子進(jìn)程開(kāi)始刷新緩沖區(qū)。

緩沖區(qū),是自己的FILE內(nèi)部維護(hù)的,屬于父進(jìn)程內(nèi)部的數(shù)據(jù)區(qū)域。而刷新的本質(zhì),是把緩沖區(qū)的數(shù)據(jù)write到OS內(nèi)部,清空緩沖區(qū)。所以,當(dāng)任意一方試圖寫(xiě)入,便以寫(xiě)時(shí)拷貝的方式各自一份副本。
所以會(huì)打印兩次。

2. 標(biāo)準(zhǔn)輸出和標(biāo)準(zhǔn)錯(cuò)誤

在這里插入圖片描述
這里C++的命名方式可以有.cpp,.cc,.cxx三種方式。

我們看一下運(yùn)行結(jié)果:
在這里插入圖片描述
這是為什么呢?我們知道:標(biāo)準(zhǔn)輸出是1,標(biāo)準(zhǔn)錯(cuò)誤是2。雖然它們都指向通一個(gè)硬件,但是不同的fd,所以它們互不影響。在這里,只是對(duì)1號(hào)文件符重定向,和2號(hào)沒(méi)有關(guān)系。

如果我們想把二者重定向到各自文件,怎么辦呢?
在這里插入圖片描述
那么,這樣的意義是什么呢?
可以區(qū)分哪些是程序日常輸出,哪些是錯(cuò)誤。方便我們?nèi)ビ^察。

如果我們就想混在一起打印呢?
在這里插入圖片描述
首先,重定向到新文件,說(shuō)明1和3都指向了all.txt。然后2>&1的意思就是將1的內(nèi)容拷貝到2,所以1,2,3,都指向了all.txt。
在這里插入圖片描述
那么這個(gè)Success又是什么意思呢?
C語(yǔ)言有一個(gè)全局變量,記錄最近一次C庫(kù)函數(shù)調(diào)用失敗的原因。這個(gè)變量就是errno。
在這里插入圖片描述

2.1 模擬perror

在這里插入圖片描述
運(yùn)行結(jié)果如下:
在這里插入圖片描述
結(jié)果和perror是一樣的。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

分享標(biāo)題:基礎(chǔ)IO——緩沖區(qū)-創(chuàng)新互聯(lián)
文章地址:http://muchs.cn/article0/cesioo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃全網(wǎng)營(yíng)銷推廣、網(wǎng)站設(shè)計(jì)、微信公眾號(hào)、做網(wǎng)站面包屑導(dǎo)航

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站建設(shè)網(wǎng)站維護(hù)公司