色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区

 

在Linux下IO操作簡述

作者:楊老師,華清遠(yuǎn)見教育科技集團(tuán)講師。

在linux下的C程序編程中對文件的IO操作有標(biāo)準(zhǔn)IO和文件IO兩種操作類型。標(biāo)準(zhǔn)IO是帶緩沖的IO屬于庫函數(shù),文件IO是不帶緩沖的屬于系統(tǒng)調(diào)用。系統(tǒng)調(diào)用和庫函數(shù)之間的區(qū)別如下圖1-1


圖 1-1

一、 標(biāo)準(zhǔn)IO

標(biāo)準(zhǔn)IO的緩沖類型分為:全緩沖、行緩沖、不緩沖三種類型。

在標(biāo)準(zhǔn)IO中對文件操作默認(rèn)是全緩沖的,對于磁盤文件的緩沖區(qū)是由標(biāo)準(zhǔn)IO庫中的函數(shù)通過malloc來獲得的。

在標(biāo)準(zhǔn)IO中與終端相關(guān)的通常是行緩沖,但是如果標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出不涉及交互時也可以設(shè)成全緩沖。

標(biāo)準(zhǔn)出錯是不帶緩沖的,這樣就可以將出錯信息實時的顯示出來。

這三種緩沖類型可以通過void setbuf(FILE * f p, char * b u f) 和int setvbuf(FILE * f p, char * b u f,  int m o d e,  size_t   s i z e) 這兩個函數(shù)進(jìn)行修改。比如,在linux下標(biāo)準(zhǔn)輸出的行緩沖的大小默認(rèn)設(shè)置為1024個字節(jié),如果你想把它擴(kuò)大2048個字節(jié),那么就可在應(yīng)用程序中調(diào)用setbuf函數(shù)來設(shè)置。設(shè)置后再向終端進(jìn)行輸出時如果不加其他刷新條件,那么直到輸出超過2048個字節(jié)時數(shù)據(jù)才會被刷新出來。 而setvbuf函數(shù)還可以明確的指定緩沖類型,比如_IOFBF(全緩沖)、_IOLBF(行緩沖)、_IONBF(無緩沖)。

標(biāo)準(zhǔn)IO中的freopen函數(shù)是用來將一個流進(jìn)行重新定向的。如果該流之前已經(jīng)被重新定向,那么freopen函數(shù)將會清除之前的定向并且使用本次定向。通常用來將一個文件打開為stdin、stdout、stderr三個流。

fdopen函數(shù)是用來將一個已經(jīng)打開的文件描述和一個流進(jìn)行關(guān)聯(lián)。因為管道和socket套接字等描述符是不可以用標(biāo)準(zhǔn)IO的函數(shù)打開的,因此可以調(diào)用此函數(shù)進(jìn)行關(guān)聯(lián),然后就可以用標(biāo)準(zhǔn)IO的函數(shù)進(jìn)行操作了。

標(biāo)準(zhǔn)IO中g(shù)ets函數(shù)是用來從終端讀入字符串的,因為它并不會檢測字符串的長度,因此如果緩沖的大小設(shè)置不合適會導(dǎo)致未知的錯誤。gets函數(shù)從終端上讀到的字符串中后一個字符其實是‘\n’字符,然后gets函數(shù)又將‘\n’字符轉(zhuǎn)換成了‘\0’字符,所以gets函數(shù)會將后的換行符讀走。

相對于gets函數(shù)來說fgets函數(shù)是安全的因為它會檢測讀入字符的長度。當(dāng)使用fgets函數(shù)從終端上讀入字符時有兩種情況:

第一種:如果終端上輸入的字符個數(shù)小于fgets函數(shù)指定的size-1個,那么它也會將終端上‘\n’字符讀走并且在結(jié)尾添加上‘\0’字符。

第二種:如果終端上輸入的字符個數(shù)大于fgets函數(shù)指定的sisz-1個,那么它就不會讀走終端上的‘\n’字符,而且末尾始終會添加‘\0’字符。

二、文件IO

文件IO是不帶緩沖,是因為每個read和write都會調(diào)用內(nèi)核中的系統(tǒng)調(diào)用。當(dāng)使用文件IO的讀寫函數(shù)對文件進(jìn)行操作后,其實數(shù)據(jù)也并不會實時的寫入磁盤,只是放到了內(nèi)核緩沖區(qū)中,如果該緩沖區(qū)沒有寫滿,那么不會將該緩沖區(qū)放入到輸出隊列。只有緩沖區(qū)滿了或者內(nèi)核需要該緩沖區(qū),那么才將該緩沖區(qū)加入到輸出隊列中,等待其到達(dá)隊首時才可以進(jìn)行實際的IO操作。

在使用open函數(shù)打開文件時,如果使用了O_SYNC標(biāo)志,那么當(dāng)調(diào)用的write函數(shù)在返回時就已經(jīng)將數(shù)據(jù)寫入到磁盤上了。而如果是調(diào)用sync()函數(shù),那么當(dāng)該函數(shù)返回時數(shù)據(jù)并沒有寫到磁盤上而僅僅是被放到了輸出隊列中。

文件IO中的定位函數(shù)lseek可以返回一個負(fù)的文件指針偏移,因為對于某些設(shè)備文件允許負(fù)的偏移量。因此在對lseek函數(shù)進(jìn)行出錯判斷時,不可以用是否小于0,而應(yīng)該用是否等于-1。當(dāng)時用lseek函數(shù)生成一個空洞文件時,其實文件的空洞部分是不占磁盤塊的。使用ls –ls命令查看兩個字節(jié)大小相同但是一個有空洞,一個沒有空洞的文件時會發(fā)現(xiàn),有空洞的文件所占的磁盤塊要少(空洞的大小要足夠大時才可以看到現(xiàn)象),如下圖1-2:


圖 1-2

色偷偷偷亚洲综合网另类,亚洲欧美另类在线观看,欧美午夜激情在线,久久久精品一区
主站蜘蛛池模板: 亚洲图片欧美午夜| 国产精品入口夜色视频大尺度| 欧美黄色免费网站| 国产精品久久久久久久app| 亚洲精品欧美日韩专区| 亚洲网站视频福利| 欧美日韩在线视频一区| 日韩av手机在线| 在线观看欧美视频| 欧美专区国产专区| 亚洲图片在线综合| 日本91av在线播放| 在线视频日本亚洲性| 奇门遁甲1982国语版免费观看高清| 亚洲精品欧美日韩| 国语对白做受69| 国产亚洲福利一区| 国产精品久久77777| 久久99久久亚洲国产| 91精品久久久久久综合乱菊 | 久久久久在线观看| 日韩午夜在线视频| 亚洲精品女av网站| 欧美一区二区三区……| 欧美成人免费一级人片100| 欧美精品亚州精品| 国产一区在线播放| 97人洗澡人人免费公开视频碰碰碰| 精品视频中文字幕| 成人黄色大片在线免费观看| 欧美激情视频免费观看| 搡老女人一区二区三区视频tv| 91精品视频在线看| 欧美在线视频播放| 午夜精品在线视频| 久久久久久久久久国产精品| 久久天天躁狠狠躁老女人| 亚洲女人被黑人巨大进入| 日韩av网站在线| 日韩成人中文字幕| 亚洲国产小视频|