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

首頁 > 系統 > Unix > 正文

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

2024-06-28 13:25:00
字體:
來源:轉載
供稿:網友
《Unix環境高級編程》讀書筆記 第3章-文件I/O1. 引言
  • Unix系統的大多數文件I/O只需用到5個函數:open、read、write、lseek以及close
  • 本章描述的函數經常被稱為不帶緩沖的I/O。術語不帶緩沖指的是在用戶的進程中對其不會自動緩沖,每個read和write都調用內核中的一個系統調用。但是,所有磁盤I/O都要經過內核的塊緩存區(也稱為內核的緩沖區高速緩存)。唯一例外的是對原始磁盤設備的I/O。
2. 文件描述符
  • 對于內核而言,所有打開的文件都通過文件描述符引用。文件描述符是一個非負整數,其變化范圍是0~OPEN_MAX-1
  • 慣例:幻數0、1、2分別為符號常量STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO
3. 函數open、openat:創建或打開一個文件
  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參數

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

  • fd參數把open和openat函數區分開,共有3種可能性

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

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

    指計算機系統的資料與權限等狀態的檢查與使用之間,因為特定狀態在這段時間已發生改變所產生的軟件漏洞

  • 文件名和路徑名截斷

4. 函數creat:創建一個新文件
  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的一個不足之處是它以只寫方式打開所創建的文件
5. 函數close
  1. #include <unistd.h>
  2. int close(int fd);
  3. Returns: 0 if OK, −1 on error
  • 關閉一個文件時會釋放該進程加在該文件的所有記錄鎖
  • 當一個進程終止時,內核自動關閉它所有的打開文件
6. 函數lseek:為一個打開文件設置偏移值
  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
  • 每個打開文件(通過open)都有一個與其關聯的“當前文件偏移量”。它通常是一個非負整數(有可能為負),用于度量從文件開始處計算的字節數。
  • offse參數的解釋與whence參數的值有關:SEEK_SET、SEEK_CUR、SEEK_END
  • 若lseek執行成功,返回新的文件偏移量,故可通過 lseek( fd, 0, SEEK_CUR ); 確定當前偏移量
  • 可用來確定所涉及的文件是否可以設置偏移量,管道、FIFO或網絡套接字不可以,lseek返回-1,errno被設置為ESPIPE
  • 名字中的l是在引入off_t類型之前,offset參數和返回值都是long
7. 函數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
  • 讀操作從文件的當前偏移處開始,在成功返回之前,該偏移量將增加實際讀到的字節數
  • 多種情況下使得讀到的字節數少于要求讀的字節數
    1. 讀普通文件時,到達文件尾端
    2. 從終端設備讀時,通常一次最多讀一行
    3. 從網絡讀時,網絡中的緩沖機制可能造成返回值小于所要求讀的字節數
    4. 從管道或FIFO讀時,如若管道包含的字節少于所需的數量,那么read將只返回實際可用的字節數
    5. 從某些面向記錄的設備(如磁帶)讀時,一次最多返回一個記錄
    6. 當一信號造成中斷,而已經讀了部分數據量時
8. 函數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
  • 其返回值通常與參數nbytes的值相同,否則表示錯誤。
  • 對于普通文件,寫操作從文件的當前偏移處開始。如果在打開文件時,指定了O_APPEND選項,則在每次寫操作之前,將文件偏移量設置在文件的當前結尾處
9. I/O的效率
  • 大多數文件系統為改善性能都采用某種預讀技術
10. 文件共享
  • 內核使用3種數據結構表示打開文件,它們之間的關系決定了在文件共享方面一個進程對另一個進程可能產生的影響

  • 左邊:進程級的文件描述符表

    1. 文件描述符標志,目前只有一個FD_CLOEXEC
    2. 指向一個文件表項的指針
  • 中間:系統級的打開文件表:每次調用open打開一個文件新增一個文件表項(不同進程可打開同一個文件,導致多個文件表項)

    1. 文件狀態標志(讀、寫、添寫、同步、非阻塞等,受open時指定的oflag參數影響,也可通過fcntl函數指定FD_SETFL改變)
    2. 當前文件偏移量
    3. 指向該文件v節點表項的指針
  • 右邊:文件系統級的i-node表

    1. i節點包含文件的相關信息,如文件的所有者、文件長度、指向文件實際數據塊在磁盤上所在位置的指針等。
    2. linux沒有v節點,而是采用了一個通用i節點。無論是v節點還是通用i節點,它們都是指向一個與文件系統相關的i節點
  • 其他

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

  • 函數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);
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品亚洲精品福利线在观看| 亚洲午夜精品视频| 隔壁老王国产在线精品| 国产成人精品视频在线| 国产精品久久久久99| 精品呦交小u女在线| 青青在线视频一区二区三区| 欧洲一区二区视频| 欧美xxxx18国产| 大量国产精品视频| 欧美在线视频一区二区| 成人国产亚洲精品a区天堂华泰| 中文字幕久久久av一区| 日韩在线观看视频免费| 精品久久久91| 欧美视频在线看| 最近2019中文字幕在线高清| 亚洲精品之草原avav久久| 久久久久久久久久久人体| 情事1991在线| 高清日韩电视剧大全免费播放在线观看| 正在播放欧美视频| 亚洲精品之草原avav久久| 精品久久久久久久久久国产| 欧美精品久久久久久久| 国产精品丝袜白浆摸在线| 国产精品扒开腿爽爽爽视频| 最近2019中文字幕大全第二页| 懂色av一区二区三区| 国模私拍一区二区三区| 国产精品美腿一区在线看| 亚洲最大福利视频网站| 神马国产精品影院av| 高跟丝袜欧美一区| 欧美日韩精品在线视频| 日韩欧美综合在线视频| 日韩精品中文字幕在线播放| 国产精品丝袜高跟| 色婷婷成人综合| 亚洲自拍偷拍色图| 欧美激情视频网址| 在线视频欧美性高潮| 国产日韩欧美日韩| 国产suv精品一区二区三区88区| 久久资源免费视频| 最新国产精品亚洲| 亚洲天堂影视av| 欧美影院在线播放| 日韩精品视频在线免费观看| 欧美性极品xxxx娇小| 91亚洲一区精品| 国产精品爱久久久久久久| 欧美黄色免费网站| 日韩女优在线播放| 欧美综合一区第一页| 国产精品视频精品| 国产成人精品a视频一区www| 4438全国亚洲精品在线观看视频| 欧洲亚洲免费在线| 欧美国产精品人人做人人爱| 亚洲人精选亚洲人成在线| 亚洲人成电影网站色www| 久久久久久久久久久国产| 欧美精品在线免费播放| 搡老女人一区二区三区视频tv| 26uuu国产精品视频| 国产精品偷伦视频免费观看国产| 超碰91人人草人人干| 国产精品91在线观看| 亚洲第一男人天堂| 欧美精品日韩www.p站| 欧美日韩国产第一页| 国模私拍视频一区| 一区二区在线免费视频| 国产亚洲精品美女| www.久久色.com| 日韩中文字幕在线| 亚洲国产欧美自拍| 久久精品99久久香蕉国产色戒| 日本午夜在线亚洲.国产| 亚洲色图13p| 91精品国产自产在线老师啪| 欧美野外wwwxxx| 国产91露脸中文字幕在线| 国产精品盗摄久久久| 亚洲一区二区免费在线| 国产成人avxxxxx在线看| 最近2019中文字幕mv免费看| 午夜精品理论片| 亚洲社区在线观看| 国产剧情久久久久久| 久久久久久久999| 欧美日韩电影在线观看| 中文字幕欧美日韩在线| 亚洲一区精品电影| 欧美乱大交xxxxx| 91国在线精品国内播放| 国产一区二区三区丝袜| 伊人久久综合97精品| 欧洲亚洲女同hd| 精品国产乱码久久久久久虫虫漫画| 国产在线精品一区免费香蕉| 欧美一级成年大片在线观看| 亚洲第一精品自拍| 欧美精品少妇videofree| 国产美女91呻吟求| 国产精品久久久av久久久| 久青草国产97香蕉在线视频| 日本精品中文字幕| 久久精品国产一区二区电影| 91国语精品自产拍在线观看性色| 色天天综合狠狠色| 日韩中文字幕在线免费观看| 深夜精品寂寞黄网站在线观看| 国产婷婷成人久久av免费高清| 在线观看成人黄色| 亚洲人午夜精品| 岛国av在线不卡| 久久久噜噜噜久久久| 91在线观看免费| 久久久久久久国产精品| 日韩欧美精品网站| 中文字幕在线观看亚洲| 中日韩美女免费视频网站在线观看| 中文字幕日韩在线播放| 亚洲精品720p| 97国产精品人人爽人人做| 亚洲另类图片色| 国产精品第一视频| 午夜伦理精品一区| 国内免费久久久久久久久久久| 国产亚洲欧美日韩美女| …久久精品99久久香蕉国产| 91在线高清免费观看| 久久久免费av| 国产精品久久久久秋霞鲁丝| xvideos亚洲| 97精品视频在线| 欧美成人精品三级在线观看| 日韩美女写真福利在线观看| 欧美人在线视频| 亚洲电影在线观看| 青青草国产精品一区二区| 成人综合网网址| 国产一区二区黑人欧美xxxx| 成人激情电影一区二区| 日韩国产精品视频| 亚洲国产精品国自产拍av秋霞| 自拍亚洲一区欧美另类| xvideos亚洲人网站| 欧美激情图片区| 精品少妇v888av| 久国内精品在线| 欧美裸身视频免费观看| 亚洲一区二区三区视频播放| 国产美女精品视频免费观看| 午夜精品美女自拍福到在线| 国内精品国产三级国产在线专| 亚洲电影中文字幕| 欧美国产中文字幕| 亚洲女人初尝黑人巨大| 国产精品久久婷婷六月丁香| 欧美午夜无遮挡| 亚洲香蕉成人av网站在线观看|