亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統(tǒng) > Unix > 正文

《Unix環(huán)境高級編程》讀書筆記 第3章-文件I/O

2024-06-28 13:25:00
字體:
供稿:網(wǎng)友
《Unix環(huán)境高級編程》讀書筆記 第3章-文件I/O1. 引言
  • Unix系統(tǒng)的大多數(shù)文件I/O只需用到5個(gè)函數(shù):open、read、write、lseek以及close
  • 本章描述的函數(shù)經(jīng)常被稱為不帶緩沖的I/O。術(shù)語不帶緩沖指的是在用戶的進(jìn)程中對其不會自動(dòng)緩沖,每個(gè)read和write都調(diào)用內(nèi)核中的一個(gè)系統(tǒng)調(diào)用。但是,所有磁盤I/O都要經(jīng)過內(nèi)核的塊緩存區(qū)(也稱為內(nèi)核的緩沖區(qū)高速緩存)。唯一例外的是對原始磁盤設(shè)備的I/O。
2. 文件描述符
  • 對于內(nèi)核而言,所有打開的文件都通過文件描述符引用。文件描述符是一個(gè)非負(fù)整數(shù),其變化范圍是0~OPEN_MAX-1
  • 慣例:幻數(shù)0、1、2分別為符號常量STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO
3. 函數(shù)open、openat:創(chuàng)建或打開一個(gè)文件
  1. #include <fcntl.h>
  2. int open(const char *path, int oflag, ... /* mode_t mode */ );
  3. int openat(int fd, const char *path, int oflag, ... /* mode_t mode */ );
  4. Both return: file descriptor if OK, −1 on error
  • oflag參數(shù)

    1. 以下5個(gè)常量必須指定一個(gè)且只能指定一個(gè)O_RDONLY、O_WRONLY、O_RDWR、O_EXEC(只執(zhí)行打開)、O_SEARCH(只搜索打開,應(yīng)用于目錄,尚未支持)
    2. 下列常量則可選O_APPEND、O_CLOEXEC、O_CREAT(需要指定第3個(gè)參數(shù)mode)、O_EXCL、O_DIRECTORY、O_NOFOLLOW、O_NONBLOCK、O_SYNC、O_TRUNC
  • open和openat函數(shù)返回的文件描述符一定是最小的未用描述符數(shù)值。這一點(diǎn)被某些應(yīng)用程序用來在標(biāo)準(zhǔn)輸入、標(biāo)準(zhǔn)輸出或標(biāo)準(zhǔn)錯(cuò)誤上打開新的文件。

  • fd參數(shù)把open和openat函數(shù)區(qū)分開,共有3種可能性

    1. path參數(shù)指定的是絕對路徑名,則fd參數(shù)被忽略,openat函數(shù)相當(dāng)于open函數(shù)
    2. path參數(shù)指定的是相對路徑名,則fd參數(shù)指出了相對路徑名在文件系統(tǒng)中的開始地址。fd參數(shù)是通過打開相對路徑名所在的目錄來獲取
    3. path參數(shù)指定了相對路徑名,而fd參數(shù)具有特殊值AT_FDCWD,則路徑名在當(dāng)前工作目錄中獲取
  • openat函數(shù)是POSIX.1最新版本中新增的一類函數(shù)之一,希望解決兩個(gè)問題:

    1. 讓線程可以使用相對路徑名打開目錄中的文件,而不再只能打開當(dāng)前工作目錄
    2. 可以避免time-of-check-to-time-of-use(TOCTTOU)錯(cuò)誤
  • TOCTTOU錯(cuò)誤的基本思想是:

    指計(jì)算機(jī)系統(tǒng)的資料與權(quán)限等狀態(tài)的檢查與使用之間,因?yàn)樘囟顟B(tài)在這段時(shí)間已發(fā)生改變所產(chǎn)生的軟件漏洞

  • 文件名和路徑名截?cái)?/p>

4. 函數(shù)creat:創(chuàng)建一個(gè)新文件
  1. #include <fcntl.h>
  2. int creat(const char *path, mode_t mode);
  3. Returns: file descriptor opened for write-only if OK, −1 on error
  • 等效于 open( path, O_WRONLY | O_CREAT | O_TRUNC, mode );
  • creat的一個(gè)不足之處是它以只寫方式打開所創(chuàng)建的文件
5. 函數(shù)close
  1. #include <unistd.h>
  2. int close(int fd);
  3. Returns: 0 if OK, −1 on error
  • 關(guān)閉一個(gè)文件時(shí)會釋放該進(jìn)程加在該文件的所有記錄鎖
  • 當(dāng)一個(gè)進(jìn)程終止時(shí),內(nèi)核自動(dòng)關(guān)閉它所有的打開文件
6. 函數(shù)lseek:為一個(gè)打開文件設(shè)置偏移值
  1. #include <unistd.h>
  2. off_t lseek(int fd, off_t offset, int whence);
  3. Returns: new file offset if OK, −1 on error
  • 每個(gè)打開文件(通過open)都有一個(gè)與其關(guān)聯(lián)的“當(dāng)前文件偏移量”。它通常是一個(gè)非負(fù)整數(shù)(有可能為負(fù)),用于度量從文件開始處計(jì)算的字節(jié)數(shù)。
  • offse參數(shù)的解釋與whence參數(shù)的值有關(guān):SEEK_SET、SEEK_CUR、SEEK_END
  • 若lseek執(zhí)行成功,返回新的文件偏移量,故可通過 lseek( fd, 0, SEEK_CUR ); 確定當(dāng)前偏移量
  • 可用來確定所涉及的文件是否可以設(shè)置偏移量,管道、FIFO或網(wǎng)絡(luò)套接字不可以,lseek返回-1,errno被設(shè)置為ESPIPE
  • 名字中的l是在引入off_t類型之前,offset參數(shù)和返回值都是long
7. 函數(shù)read
  1. #include <unistd.h>
  2. ssize_t read(int fd, void *buf, size_t nbytes);
  3. Returns: number of bytes read, 0 if end of file, −1 on error
  • 讀操作從文件的當(dāng)前偏移處開始,在成功返回之前,該偏移量將增加實(shí)際讀到的字節(jié)數(shù)
  • 多種情況下使得讀到的字節(jié)數(shù)少于要求讀的字節(jié)數(shù)
    1. 讀普通文件時(shí),到達(dá)文件尾端
    2. 從終端設(shè)備讀時(shí),通常一次最多讀一行
    3. 從網(wǎng)絡(luò)讀時(shí),網(wǎng)絡(luò)中的緩沖機(jī)制可能造成返回值小于所要求讀的字節(jié)數(shù)
    4. 從管道或FIFO讀時(shí),如若管道包含的字節(jié)少于所需的數(shù)量,那么read將只返回實(shí)際可用的字節(jié)數(shù)
    5. 從某些面向記錄的設(shè)備(如磁帶)讀時(shí),一次最多返回一個(gè)記錄
    6. 當(dāng)一信號造成中斷,而已經(jīng)讀了部分?jǐn)?shù)據(jù)量時(shí)
8. 函數(shù)write
  1. #include <unistd.h>
  2. ssize_t write(int fd, const void *buf, size_t nbytes);
  3. Returns: number of bytes written if OK, −1 on error
  • 其返回值通常與參數(shù)nbytes的值相同,否則表示錯(cuò)誤。
  • 對于普通文件,寫操作從文件的當(dāng)前偏移處開始。如果在打開文件時(shí),指定了O_APPEND選項(xiàng),則在每次寫操作之前,將文件偏移量設(shè)置在文件的當(dāng)前結(jié)尾處
9. I/O的效率
  • 大多數(shù)文件系統(tǒng)為改善性能都采用某種預(yù)讀技術(shù)
10. 文件共享
  • 內(nèi)核使用3種數(shù)據(jù)結(jié)構(gòu)表示打開文件,它們之間的關(guān)系決定了在文件共享方面一個(gè)進(jìn)程對另一個(gè)進(jìn)程可能產(chǎn)生的影響

  • 左邊:進(jìn)程級的文件描述符表

    1. 文件描述符標(biāo)志,目前只有一個(gè)FD_CLOEXEC
    2. 指向一個(gè)文件表項(xiàng)的指針
  • 中間:系統(tǒng)級的打開文件表:每次調(diào)用open打開一個(gè)文件新增一個(gè)文件表項(xiàng)(不同進(jìn)程可打開同一個(gè)文件,導(dǎo)致多個(gè)文件表項(xiàng))

    1. 文件狀態(tài)標(biāo)志(讀、寫、添寫、同步、非阻塞等,受open時(shí)指定的oflag參數(shù)影響,也可通過fcntl函數(shù)指定FD_SETFL改變)
    2. 當(dāng)前文件偏移量
    3. 指向該文件v節(jié)點(diǎn)表項(xiàng)的指針
  • 右邊:文件系統(tǒng)級的i-node表

    1. i節(jié)點(diǎn)包含文件的相關(guān)信息,如文件的所有者、文件長度、指向文件實(shí)際數(shù)據(jù)塊在磁盤上所在位置的指針等。
    2. linux沒有v節(jié)點(diǎn),而是采用了一個(gè)通用i節(jié)點(diǎn)。無論是v節(jié)點(diǎn)還是通用i節(jié)點(diǎn),它們都是指向一個(gè)與文件系統(tǒng)相關(guān)的i節(jié)點(diǎn)
  • 其他

    1. 完成write之后,文件表項(xiàng)的當(dāng)前文件偏移量增加所寫入的字節(jié)數(shù)。如果這導(dǎo)致當(dāng)前文件偏移量超出了文件長度,則將i節(jié)點(diǎn)表項(xiàng)中的當(dāng)前文件長度設(shè)置為當(dāng)前文件偏移量
    2. 如果通過O_APPEND標(biāo)志打開一個(gè)文件,則相應(yīng)標(biāo)志會設(shè)置到文件表項(xiàng)的文件狀態(tài)標(biāo)志中。每次執(zhí)行寫操作之前,當(dāng)前文件偏移量會首先被設(shè)置為i節(jié)點(diǎn)表項(xiàng)中的文件長度
    3. lseek函數(shù)只修改文件表項(xiàng)中的當(dāng)前文件偏移量,不進(jìn)行任何I/O操作。
    4. 注意:文件描述符標(biāo)志只作用于一個(gè)進(jìn)程的一個(gè)文件描述符,而文件狀態(tài)標(biāo)志則作用于指向該文件表項(xiàng)的任何進(jìn)程中的所有描述符
11. 原子操作
  • 先lseek再write,不等價(jià)于,指定了O_APPEND的write
  • 對open函數(shù)指定O_CREAT和O_EXCL

  • 函數(shù)PRead、pwrite

  1. #include <unistd.h>
  2. ssize_t pread(int fd, void *buf, size_t nbytes, off_t offset);
  3. Returns: number of bytes read, 0 if end of file, −1 on error
  4. ssize_t pwrite(int fd, const void *buf, size_t nbytes, off_t offset);
發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
一区二区xxx| 日韩成人在线一区| 99免费在线观看| av电影在线观看一区二区三区| 国产精品三区在线观看| 亚洲精品乱码久久久久久蜜桃动漫| 搜索黄色一级片| 欧美激情国产精品免费| 尤物九九久久国产精品的特点| 日韩二区三区在线观看| 无尽裸体动漫2d在线观看| 国产精品 日产精品 欧美精品| 国产精品久久久久国产a级| 91精品无人成人www| 伊人免费视频| 一区二区的视频| 日本免费在线观看| 捆绑紧缚一区二区三区视频| 久久久不卡影院| 欧美激情精品久久久久久免费印度| 亚洲a成v人在线观看| www国产91| 日本中文在线观看| 91在线视频18| 国产三级三级在线观看| 亚洲中文一区二区| 欧美激情在线观看视频免费| 成人在线免费| 亚洲欧美综合区自拍另类| 国产一区二区三区黄片| 欧美日韩电影一区| 国产爆乳无码一区二区麻豆| 中文字幕一区二区三区手机版| 久久久人成影片一区二区三区| 青青草av免费在线观看| 小香蕉视频在线| 中文字幕三级电影| 韩国日本一区二区三区| av第一福利大全导航| 国产精品美女久久久久久不卡| 亚洲一区二区三区四区在线播放| 热99re久久精品精品免费| jizz免费一区二区三区| 欧美日韩伊人| 国产成人精品1024| 国产a级片免费观看| 国产乱人乱偷精品视频a人人澡| 视频一区在线视频| 国产jjizz一区二区三区视频| 四虎国产精品永久在线| 国产精品一区二区三区四区色| 在线观看你懂的网站| 黄色动漫网站| 黄色视屏网站在线免费观看| av漫画网站在线观看| 欧美ab在线视频| 波多野结衣综合网| 特大巨黑人吊性xxxxn38| 亚洲成人a**址| 就爱干草视频| 99亚偷拍自图区亚洲| 日韩美女视频网站| 91精品日本| 欧美丰满熟妇bbbbbb| 黄色网页在线看| 成人午夜影院在线观看| 久久国产婷婷国产香蕉| 亚洲一区 在线播放| 亚洲国产成人精品久久久国产成人一区| 日韩欧美在线播放视频| 日本一级淫片演员| 精品国产91亚洲一区二区三区www| 911精品美国片911久久久| 91av在线不卡| 不卡的av电影在线观看| 波多野结衣在线影院| 亚洲国产精品嫩草影院久久av| 欧美日韩成人在线观看| 成人亚洲精品777777ww| 日韩妆和欧美的一区二区| 中文精品久久久久人妻不卡| 亚洲国产中文字幕在线视频综合| 欧美贵妇videos办公室| 国产精品免费福利| 热三久草你在线| 欧美电影在线观看免费| 国产传媒在线播放| 国产成人免费网站| 国产精品久久久久久久久免费桃花| 亚洲主播在线观看| 爱情岛论坛亚洲首页入口章节| 国产美女视频黄a视频免费| **爰片久久毛片| 欧美日韩一区二区在线观看视频| av网址在线免费观看| 欧美一级大片在线免费观看| 五月天婷亚洲天综合网鲁鲁鲁| 波多野结衣av无码| 亚洲精品一区二区在线| 曰本女人与公拘交酡| 国产女人av| 亚洲综合久久网| 隣の若妻さん波多野结衣| 青青久草在线| 国产精品久久久久无码av色戒| 日本在线一区二区三区| 91影院未满十八岁禁止入内| 怡红院av一区二区三区| 天天综合五月天| 亚洲综合伊人久久大杳蕉| 精品福利av| 黄色电影网站在线观看| 美女在线视频一区| 综合一区二区三区| av高清不卡| 男人的天堂导航| 91爱视频在线| 天天操中文字幕视频| 在线观看岛国av| 色视频在线播放| 国产大学生自拍视频| 黄色免费在线网站| 超级砰砰砰97免费观看最新一期| 精品香蕉一区二区三区| 日本人体一区二区| 亚洲丝袜另类动漫二区| 国产成人一区二区三区别| 97人洗澡人人免费公开视频碰碰碰| 亚洲自拍偷拍网站| 另类av导航| 欧美最猛黑人xxxx黑人猛叫黄| 99精品久久久久久中文字幕| 欧美1级2级| 亚洲欧美久久婷婷爱综合一区天堂| 99精品视频在线观看播放| 日本一级片免费看| 一区二区三区视频免费看| 欧美xxxxxxxxx59| 人妻精品一区一区三区蜜桃91| 特黄视频免费观看| 欧美性极品少妇精品网站| 久久91超碰青草是什么| 秋霞毛片久久久久久久久| 亚洲国产精品大全| 日韩欧美在线播放视频| 亚洲欧美综合图片| 成人午夜在线| 亚洲综合视频一区| 26uuu另类亚洲欧美日本老年| 色琪琪一区二区三区亚洲区| 午夜精品久久久久久久96蜜桃| 九九九九九精品| 国产精品合集一区二区| wwwxxx黄色片| 亚洲国产精品黑人久久久| 久久亚洲私人国产精品va| 欧美日韩成人一区二区三区| 亚洲国产裸拍裸体视频在线观看乱了| 久久99导航| 亚洲最大最好的私人影剧院| 成人天堂噜噜噜| 91久久夜色精品国产网站| 日韩av在线天堂网| 91蝌蚪在线| 视频一区中文| 国产成人综合久久| 婷婷五月精品中文字幕| 精品中文字幕视频| 一本久久综合| 伊人网站在线| 一区二区三区丝袜| 国产成人在线免费看| 热三久草你在线| 国产福利在线看| 亚洲男人的天堂在线视频| 国产一级淫片a| 人妻少妇偷人精品久久久任期| 欧美成人影院| 热re66久久精品国产99re| 欧美性活一级视频| 成人av在线影院| 国产亚洲欧洲在线| 任你操视频在线观看| 婷婷五月综合久久中文字幕| 在线视频免费观看一区| 午夜在线免费观看视频| 成人在线免费播放视频| 性爱视频在线播放| 第四色中文综合网| 亚洲怡红院av| av电影成人| 女女互磨互喷水高潮les呻吟| 日韩一区在线免费观看| 一区二区视频观看| 99久久精品免费看| 亚洲视频免费一区| 不卡一区二区在线观看| 最好看的日本字幕mv视频大全| 欧美性色欧美a在线播放| 欧美97人人模人人爽人人喊视频| 午夜3点看的视频| 色愁久久久久久| 91porn在线视频| 精品国产一区二区三区av片| 国产精品爱久久久久久久| 国产精品色一区二区三区| 亚洲精品国产精品国自产观看| 欧美综合亚洲图片综合区| 国产一区二区三区美女秒播| 黄色片网站在线免费观看| 欧美天堂社区| 超碰在线一区| 国产精品久久久久毛片软件| 嫩草视频在线免费观看| 777精品久无码人妻蜜桃| 欧美剧情电影在线观看完整版免费励志电影| 欧美精品一区二区三| 欧美日韩另类一区| 在线观看免费国产成人软件| 韩日在线视频| 日韩一区二区在线免费观看| 亚洲福利一二三区| 亚洲欧洲成人精品av97| 在线精品国产成人综合| jizz18欧美18| 免费高清视频在线观看| 被陌生人带去卫生间啪到腿软| 国产福利在线导航| 五月婷婷在线观看视频| h在线观看网站| 成年人在线播放| 日本不卡一区视频| 亚洲免费看av| 国产精品99视频| 日韩av男人天堂| 中文字幕v亚洲ⅴv天堂| 国产精品日韩专区| 在线一区视频| 天堂免费在线视频| 精品色999| 国产福利精品av综合导导航| √天堂中文www官网| 先锋影音男人站你懂得| 欧美在线视频第一页| 日韩av网址在线观看| 日韩国产专区| 亚洲天堂av图片| 亚洲国产欧美在线人成| 午夜午夜精品一区二区三区文| 免费成人你懂的| 久久精品这里热有精品| 精品久久久久久久久久岛国gif| 日韩精品视频网址| 极品尤物av久久免费看| 日韩av不卡在线| 国内少妇毛片视频| 欧美在线亚洲综合一区| 久草免费在线观看视频| 欧美成人精品激情在线观看| 麻豆av免费观看| 欧洲精品国产| 欧美一区二区精美| 成人三级视频在线观看| 在线免费黄色小视频| 男男做爰猛烈叫床爽爽小说| www.久久久久久久久久久| 国产盗摄精品一区二区酒店| 久久成人久久鬼色| 91看片淫黄大片一级| 成人激情综合网站| 欧美日韩国产综合视频在线观看中文| 精品在线视频一区二区三区| 天堂网2014av| 在线观看视频一区二区欧美日韩| 欧美一区深夜视频| 新版的欧美在线视频| 国产精品视频一区在线观看| 国产成人免费精品| 欧美亚韩一区二区三区| 亚洲va久久| 欧洲亚洲视频| 91亚洲大成网污www| 久久9热精品视频| 爱福利一区二区| 国产精品视频一二三四区| 成年人在线观看网站| 秋霞成人午夜伦在线观看| 欧美大片1688网站| 竹内纱里奈兽皇系列在线观看| 日日av拍夜夜添久久免费| 欧美69精品久久久久久不卡| 久久亚洲影视| 日韩精品久久一区| 正在播放国产一区| a91a精品视频在线观看| 777久久久精品| 女人床在线观看| 91久久国产视频| 久久美女免费视频| 最新欧美色图| 中文字幕无码毛片免费看| 日韩精品欧美国产精品忘忧草| 国产一区视频观看| 亚洲午夜精品一区| 亚洲国产一区二区在线播放| 欧美最猛黑人xxxx| 在线视频 中文字幕| 99久久久无码国产精品免费| 97在线播放视频| 自拍小视频在线观看| 最新不卡av在线| 久久精品久久综合| x88av蜜桃臀一区二区| 精品国产一区二区三区噜噜噜| 美女亚洲精品| 国产偷国产偷亚洲高清97cao| 日韩高清成人在线| 日本不卡一二区| 欧美成人蜜桃| 色视频在线免费观看| 东方aⅴ免费观看久久av| 色综合天天天天做夜夜夜夜做| 国产精品久久久久久超碰| 秋霞午夜理伦电影在线观看| 亚洲欧洲视频在线观看| 婷婷中文字幕综合| 午夜影视日本亚洲欧洲精品| 97成人免费视频|