apue 第三章 文件I/O

apue 第三章 文件I/O

文件描述符

  • 對(duì)于內(nèi)核刹前,所有打開的文件都通過文件描述符引用
  • STDIN_FILEOUT,STDOUT_FILEOUT,STDERR_FILEOUT,0宋雏,1,2是unix系統(tǒng)shell的標(biāo)準(zhǔn)文件描述符

文件偏移量 lseek

  • 每一個(gè)打開的文件都有一個(gè)相關(guān)的文件偏移量雏掠,文件的讀寫操作都是從偏移量開始的
  • lseek可以設(shè)置文件的偏移量,返回設(shè)置后的偏移量纽绍,如果文件描述符指向的是一個(gè)管道署拟,網(wǎng)絡(luò)套接字婉宰,不能設(shè)置偏移量返回-1
  • 返回當(dāng)前文件偏移量,還可以檢測(cè)當(dāng)前文件描述符能否設(shè)置偏移量
#include "apue.h"
int 
main(void)
{
    if (lseek(STDIN_FILENO, 0, SEEK_CUR) == -1) 
        printf("cannot seek\n");
    else
        printf("seek OK \n");
    exit(0);
}
  • 如果設(shè)置的偏移量大于當(dāng)前文件的長(zhǎng)度推穷,對(duì)文件的下一次寫會(huì)加長(zhǎng)文件心包,沒有寫的字節(jié)置為0, 形成一個(gè) 空洞,可能會(huì)引起磁盤使用的增加

IO效率

  • 進(jìn)程關(guān)閉時(shí),會(huì)關(guān)閉所打開的文件描述符
  • 大多數(shù)文件系統(tǒng)在讀取文件會(huì)采取某種預(yù)讀技術(shù),試圖讀入比緩沖區(qū)更多的數(shù)據(jù)到內(nèi)存中。所以讀入某些大小緩沖區(qū)的數(shù)據(jù)消耗時(shí)間是差不多的馒铃。

文件共享 相關(guān)資料:p61

  • 內(nèi)核使用3種數(shù)據(jù)結(jié)構(gòu)表示打開文件蟹腾,他們之間的關(guān)系決定了在文件共享時(shí),一個(gè)文件對(duì)另外一個(gè)文件的影響

  1. 每個(gè)進(jìn)程在進(jìn)程表中都有一個(gè)進(jìn)程表項(xiàng),包含了一張進(jìn)程打開文件的 文件描述表 包含了打開的 文件描述符標(biāo)志 ,指向一個(gè)文件表項(xiàng)的 指針
  2. 內(nèi)核為每個(gè)打開的文件維護(hù)了一張文件表( 文件表項(xiàng) ) 包含了文件的 狀態(tài)標(biāo)志(讀区宇,寫岭佳,等), 當(dāng)前文件的 偏移量 ,指向該文件的 V節(jié)點(diǎn)表項(xiàng) 指針
  3. V節(jié)點(diǎn) 包含了文件信息和文件的操作函數(shù)指針,同時(shí)包含了 i節(jié)點(diǎn)(存儲(chǔ)文件長(zhǎng)度)

原子操作問題


  • 進(jìn)程A B共同寫一個(gè)文件,有2個(gè)文件表項(xiàng),但是共享一個(gè)v節(jié)點(diǎn)。A調(diào)用lseek設(shè)置偏移量為1500,內(nèi)核切換進(jìn)程B,也設(shè)置1500偏移量,然后B調(diào)用wrtie寫100字節(jié)數(shù)據(jù)萧锉,偏移量變?yōu)?600,i節(jié)點(diǎn)的文件長(zhǎng)度更新為1600。此時(shí)A的文件偏移量還是1500述寡,調(diào)用write寫數(shù)據(jù)柿隙,就會(huì)把B的數(shù)據(jù)覆蓋
  • 在這過程中,先定位到文件的尾端(lseek),然后寫(write),使用的是2個(gè)不同的函數(shù)鲫凶,在這2個(gè)函數(shù)調(diào)用之間內(nèi)核可能會(huì)掛起進(jìn)程禀崖,去執(zhí)行另外一個(gè)進(jìn)程∶牛可以在打開文件的時(shí)候設(shè)置 O_APPEND 標(biāo)志波附,每次寫操作前,都將當(dāng)期偏移量設(shè)置到文件的末尾
  • 原子操作 是指由多步執(zhí)行的一個(gè)操作昼钻,則要么執(zhí)行完所有操作掸屡,要么一步也不執(zhí)行

dup dup2

  • dup 和 dup2可以復(fù)制一個(gè)文件描述符,文件描述符共享同一個(gè)文件表項(xiàng),包括文件狀態(tài)標(biāo)志,當(dāng)前文件偏移量然评。
  • dup2可以顯示的指定文件描述符值

sync fsync

  • 向文件寫入數(shù)據(jù),數(shù)據(jù)會(huì)先寫入緩沖區(qū)(頁高速緩存)仅财,然后排入隊(duì)列,依次寫入磁盤,這種方式稱為延遲寫
  • sync 會(huì)將緩沖區(qū)的數(shù)據(jù)排入隊(duì)列就結(jié)束碗淌,不等待寫入磁盤盏求,內(nèi)核會(huì)有一個(gè)update定時(shí)調(diào)用sync抖锥,定時(shí)沖洗緩沖區(qū)
  • fsync 只對(duì)文件描述符fb的文件起作用,寫磁盤結(jié)束才返回

fcntl

  • fcntl 可以改變或獲取文件的描述符和狀態(tài)標(biāo)志,這在無法得到shell打開的文件名時(shí)很有用,只需要知道描述符,就修改屬性
#include "apue.h"
#include <fcntl.h>

int
main(int argc, char *argv[])
{
    int     val;

    if (argc != 2)
        err_quit("usage: a.out <descriptor#>");

    if ((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0)
        err_sys("fcntl error for fd %d", atoi(argv[1]));

    switch (val & O_ACCMODE) {
    case O_RDONLY:
        printf("read only");
        break;

    case O_WRONLY:
        printf("write only");
        break;

    case O_RDWR:
        printf("read write");
        break;

    default:
        err_dump("unknown access mode");
    }

    if (val & O_APPEND)
        printf(", append");
    if (val & O_NONBLOCK)
        printf(", nonblocking");
    if (val & O_SYNC)
        printf(", synchronous writes");

#if !defined(_POSIX_C_SOURCE) && defined(O_FSYNC) && (O_FSYNC != O_SYNC)
    if (val & O_FSYNC)
        printf(", synchronous writes");
#endif

    putchar('\n');
    exit(0);
}
  • 1:標(biāo)準(zhǔn)輸入 2:標(biāo)準(zhǔn)輸出 3:錯(cuò)誤 5:shell <>:標(biāo)識(shí)用文件描述符5打開數(shù)據(jù)
  • 在使用fctnl修改文件描述符或文件狀態(tài)值時(shí),需要先獲得現(xiàn)在的標(biāo)志值,然后按照期望修改
  • 通過使用fsync 或者改變文件狀態(tài)標(biāo)志位O_SYNC時(shí)可以獲得 延遲寫
out :
?  lesson_3 ./a.out 0</dev/tty
read only
?  lesson_3 ./a.out 1>temp.foo 
?  lesson_3 cat temp.foo 
write only
?  lesson_3 ./a.out 2 2>>temp.foo  
write only, append
?  lesson_3 ./a.out 5 5<>temp.foo 
read write
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末碎罚,一起剝皮案震驚了整個(gè)濱河市磅废,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌荆烈,老刑警劉巖拯勉,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異耙考,居然都是意外死亡谜喊,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門倦始,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斗遏,“玉大人,你說我怎么就攤上這事鞋邑∷写危” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵枚碗,是天一觀的道長(zhǎng)逾一。 經(jīng)常有香客問我,道長(zhǎng)肮雨,這世上最難降的妖魔是什么遵堵? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮怨规,結(jié)果婚禮上陌宿,老公的妹妹穿的比我還像新娘。我一直安慰自己波丰,他們只是感情好壳坪,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著掰烟,像睡著了一般爽蝴。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上纫骑,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天蝎亚,我揣著相機(jī)與錄音,去河邊找鬼惧磺。 笑死颖对,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的磨隘。 我是一名探鬼主播缤底,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼顾患,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了个唧?” 一聲冷哼從身側(cè)響起江解,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎徙歼,沒想到半個(gè)月后犁河,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡魄梯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年桨螺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酿秸。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灭翔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辣苏,到底是詐尸還是另有隱情肝箱,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布稀蟋,位于F島的核電站煌张,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏退客。R本人自食惡果不足惜骏融,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望萌狂。 院中可真熱鬧绎谦,春花似錦、人聲如沸粥脚。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽刷允。三九已至,卻和暖如春碧囊,著一層夾襖步出監(jiān)牢的瞬間树灶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工糯而, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留天通,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓熄驼,卻偏偏與公主長(zhǎng)得像像寒,于是被迫代替她去往敵國(guó)和親烘豹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

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

  • 國(guó)家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報(bào)批稿:20170802 前言: 排版 ...
    庭說閱讀 11,007評(píng)論 6 13
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理诺祸,服務(wù)發(fā)現(xiàn)携悯,斷路器,智...
    卡卡羅2017閱讀 134,711評(píng)論 18 139
  • 文件描述符 所有打開的文件都通過文件描述符引用筷笨。操作(讀寫)該文件描述符就相當(dāng)于操作該文件憔鬼。文件描述符是一個(gè)非負(fù)的...
    Myth52125閱讀 597評(píng)論 0 0
  • 又來到了一個(gè)老生常談的問題,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢胃夏? 今天就這個(gè)問題開始轴或,來談?wù)劜?..
    tangsl閱讀 4,134評(píng)論 0 23
  • 衛(wèi)生間作為人們?nèi)粘O词膱?chǎng)所,在生活中起著至關(guān)重要的作用仰禀。衛(wèi)生間的水電照雁、吊頂、排水等設(shè)計(jì)悼瘾,也直接影響著人們的生活質(zhì)...
    極限為簡(jiǎn)閱讀 645評(píng)論 0 0