linux高級環(huán)境編程-文件IO

開始本章學(xué)習(xí)之前了解一些概念:

1画恰、帶緩存和不帶緩存IO

參考
系統(tǒng)調(diào)用财喳,用戶程序通過系統(tǒng)級別API調(diào)用系統(tǒng)函數(shù)將請求傳遞給內(nèi)核侄榴。無緩存的IO表示在用戶層沒有緩存遭贸,每次讀寫都需要調(diào)用系統(tǒng)函數(shù)戈咳,頻繁調(diào)用系統(tǒng)函數(shù)效率是比較低的。但值得注意的是壕吹,并不是說調(diào)用了系統(tǒng)函數(shù)就會將數(shù)據(jù)寫道磁盤著蛙,這樣效率會更低,內(nèi)核中有緩沖存儲器耳贬,只有數(shù)據(jù)滿了時才會寫道磁盤踏堡。同理,為了不讓每次讀寫操作都直接調(diào)用系統(tǒng)函數(shù)咒劲,將內(nèi)容寫道用戶設(shè)置的緩存區(qū)中顷蟆,有三種常用緩存:

  • 全緩存诫隅。當(dāng)填滿標(biāo)準(zhǔn)I/O緩存后才執(zhí)行I/O操作。磁盤上的文件通常是全緩存的帐偎。
  • 行緩存逐纬。當(dāng)輸入輸出遇到新行符或緩存滿時,才由標(biāo)準(zhǔn)I/O庫執(zhí)行實際I/O操作肮街。stdin风题、stdout通常是行緩存的。
  • 無緩存嫉父。相當(dāng)于read沛硅、write了。stderr通常是無緩存的绕辖,因為它必須盡快輸出摇肌。

帶緩存IO也叫標(biāo)準(zhǔn)IO,目的就是減少調(diào)用read和write的次數(shù)仪际。舉個例子围小,寫數(shù)據(jù)到文件上,內(nèi)核緩存(注意這個不是用戶層緩存區(qū))區(qū)長度是100字節(jié)树碱,我們調(diào)用不帶緩存的IO函數(shù)write()就要調(diào)用10次(加入每次10字節(jié))肯适,這樣系統(tǒng)效率低,現(xiàn)在我們在用戶層建立另一個緩存區(qū)(用戶層緩存區(qū)或者叫流緩存)成榜,假設(shè)流緩存的長度是50字節(jié)框舔,我們用標(biāo)準(zhǔn)C庫函數(shù)的fwrite()將數(shù)據(jù)寫入到這個流緩存區(qū)里面,流緩存區(qū)滿50字節(jié)后在進入內(nèi)核緩存區(qū)赎婚,此時再調(diào)用系統(tǒng)函數(shù)write()將數(shù)據(jù)寫入到文件(實質(zhì)是磁盤)上刘绣,看到這里,你用該明白一點挣输,標(biāo)準(zhǔn)IO操作fwrite()最后還是要掉用無緩存IO操作write,這里進行了兩次調(diào)用fwrite()寫100字節(jié)也就是進行兩次系統(tǒng)調(diào)用write()纬凤。

0、open close函數(shù)
image.png
1撩嚼、lseek函數(shù)

文件偏移量概念停士,每個文件打開的位置和當(dāng)前內(nèi)容位置為偏移量,
off_t lseek(int filedes, off_t offset, int whence); 返回值:新的偏移量(成功)完丽,-1(失斚虼伞)

參數(shù) offset 的含義取決于參數(shù) whence
1. 如果 whence 是 SEEK_SET,文件偏移量將被設(shè)置為 offset舰涌。
2. 如果 whence 是 SEEK_CUR猖任,文件偏移量將被設(shè)置為 cfo 加上 offset,
offset 可以為正也可以為負(fù)瓷耙。
3. 如果 whence 是 SEEK_END朱躺,文件偏移量將被設(shè)置為文件長度加上 offset刁赖,
offset 可以為正也可以為負(fù)。
SEEK_SET长搀、SEEK_CUR 和 SEEK_END 是 System V 引入的宇弛,在這之前使用的是 0、1 和 2源请。
lseek 的以下用法返回當(dāng)前的偏移量:
off_t currpos;
currpos = lseek(fd, 0, SEEK_CUR);
這個技巧也可用于判斷我們是否可以改變某個文件的偏移量枪芒。如果參數(shù) fd(文件描述符)指定的是 pipe(管道)、FIFO 或者 socket谁尸,lseek 返回 -1 并且置 errno 為 ESPIPE舅踪。

2、read write函數(shù)
image.png
image.png
3良蛮、文件原子操作待理解
4抽碌、復(fù)制文件描述符

dup和dup2也是兩個非常有用的調(diào)用,它們的作用都是用來復(fù)制一個文件的描述符决瞳。它們經(jīng)常用來重定向進程的stdin货徙、stdout和stderr。這兩個函數(shù)的 原形如下:

#include <unistd.h> int dup( int oldfd ); int dup2( int oldfd, int targetfd )

利用函數(shù)dup皮胡,我們可以復(fù)制一個描述符痴颊。傳給該函數(shù)一個既有的描述符,它就會返回一個新的描述符屡贺,這個新的描述符是傳給它的描述符的拷貝蠢棱。這意味著,這兩個描述符共享同一個數(shù)據(jù)結(jié)構(gòu)烹笔。例如,如果我們對一個文件描述符執(zhí)行l(wèi)seek操作抛丽,得到的第一個文件的位置和第二個是一樣的谤职。

int oldfd;
oldfd = open("app_log", (O_RDWR | O_CREATE), 0644 );
dup2( oldfd, 1 );
close( oldfd );

本例中,我們打開了一個新文件亿鲜,稱為“app_log”允蜈,并收到一個文件描述符,該描述符叫做fd1蒿柳。我們調(diào)用dup2函數(shù)饶套,參數(shù)為oldfd和1,這會導(dǎo)致用我們新打開的文件描述符替換掉由1代表的文件描述符(即stdout垒探,因為標(biāo)準(zhǔn)輸出文件的id為1)妓蛮。任何寫到stdout的東西,現(xiàn)在都將改為寫入名為“app_log”的文件中圾叼。需要注意的是蛤克,dup2函數(shù)在復(fù)制了oldfd之后捺癞,會立即將其關(guān)閉,但不會關(guān)掉新近打開的文件描述符构挤,因為文件描述符1現(xiàn)在也指向它髓介。


5、sync筋现、fsync唐础、fdatasync

我們知道,內(nèi)核中設(shè)有高速緩存或頁高速緩存矾飞,大多數(shù)磁盤IO都通過緩沖區(qū)進行一膨。也叫延遲寫,當(dāng)內(nèi)核需要重用緩沖區(qū)時凰慈,會先把緩存中的數(shù)據(jù)寫入磁盤汞幢,避免丟失,要用到上面幾個函數(shù)微谓。

image.png
6森篷、fcntl

學(xué)習(xí)
主要有以下功能:

image.png

7、ioctl
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末豺型,一起剝皮案震驚了整個濱河市仲智,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌姻氨,老刑警劉巖钓辆,帶你破解...
    沈念sama閱讀 223,002評論 6 519
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異肴焊,居然都是意外死亡前联,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,357評論 3 400
  • 文/潘曉璐 我一進店門娶眷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來似嗤,“玉大人,你說我怎么就攤上這事届宠∷嘎洌” “怎么了?”我有些...
    開封第一講書人閱讀 169,787評論 0 365
  • 文/不壞的土叔 我叫張陵豌注,是天一觀的道長伤塌。 經(jīng)常有香客問我,道長轧铁,這世上最難降的妖魔是什么每聪? 我笑而不...
    開封第一講書人閱讀 60,237評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上熊痴,老公的妹妹穿的比我還像新娘他爸。我一直安慰自己,他們只是感情好果善,可當(dāng)我...
    茶點故事閱讀 69,237評論 6 398
  • 文/花漫 我一把揭開白布诊笤。 她就那樣靜靜地躺著,像睡著了一般巾陕。 火紅的嫁衣襯著肌膚如雪讨跟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,821評論 1 314
  • 那天鄙煤,我揣著相機與錄音晾匠,去河邊找鬼。 笑死梯刚,一個胖子當(dāng)著我的面吹牛凉馆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播亡资,決...
    沈念sama閱讀 41,236評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼澜共,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了锥腻?” 一聲冷哼從身側(cè)響起嗦董,我...
    開封第一講書人閱讀 40,196評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘦黑,沒想到半個月后京革,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,716評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡幸斥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,794評論 3 343
  • 正文 我和宋清朗相戀三年匹摇,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甲葬。...
    茶點故事閱讀 40,928評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡廊勃,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出演顾,到底是詐尸還是另有隱情供搀,我是刑警寧澤隅居,帶...
    沈念sama閱讀 36,583評論 5 351
  • 正文 年R本政府宣布钠至,位于F島的核電站,受9級特大地震影響胎源,放射性物質(zhì)發(fā)生泄漏棉钧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,264評論 3 336
  • 文/蒙蒙 一涕蚤、第九天 我趴在偏房一處隱蔽的房頂上張望宪卿。 院中可真熱鬧的诵,春花似錦、人聲如沸佑钾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,755評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽休溶。三九已至代赁,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間兽掰,已是汗流浹背芭碍。 一陣腳步聲響...
    開封第一講書人閱讀 33,869評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留孽尽,地道東北人窖壕。 一個月前我還...
    沈念sama閱讀 49,378評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像杉女,于是被迫代替她去往敵國和親瞻讽。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,937評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 文件操作 (Linux文件操作)) [文件|目錄] Linux文件操作:為了對文件和目錄進程處理宠纯,你需要用到系統(tǒng)...
    JamesPeng閱讀 1,474評論 1 5
  • 一卸夕、溫故而知新 1. 內(nèi)存不夠怎么辦 內(nèi)存簡單分配策略的問題地址空間不隔離內(nèi)存使用效率低程序運行的地址不確定 關(guān)于...
    SeanCST閱讀 7,822評論 0 27
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)婆瓜,斷路器快集,智...
    卡卡羅2017閱讀 134,720評論 18 139
  • 底層文件訪問 open系統(tǒng)調(diào)用 在遵循POSIX規(guī)范的系統(tǒng)上,使用open系統(tǒng)調(diào)用并不需要包含頭文件sys/typ...
    Select_Ep閱讀 1,478評論 1 3
  • 先放一張美圖院溺。 我和張小盒的美照。哈哈 接下來有密集恐懼癥的同學(xué)磅轻,慎點珍逸。。 寫在前面聋溜,1.你要是沒有閉口你就不要看...
    王大可67閱讀 1,109評論 0 51