第三章 文件IO

  • 對于內核而言,所有打開的文件都通過文件描述符引用,文件描述符是一個非負整數

    文件描述符 標準 符號常量
    文件描述符0 標準輸入 STDIN_FILENO
    文件描述符1 標準輸出 STDOUT_FILENO
    文件描述符2 標準錯誤 STDERR_FILENO
  • 函數open和openat---打開文件

    int open(const char *path, int oflag, .../*mode_t mode*/)
    
    int openat(int fd,const char *path, int oflag, .../*mode_t mode*/)
            兩函數的返回值:若成功,返回文件描述符,若出錯,返回-1
    
    • path---要打開或創建文件的名字
    • oflag---用來說明此函數的多個選項
    • fd---把open和openat函數區分開,有下列三種情況
      1. path參數指定的是絕對路徑名,在這種情況下,fd參數被忽略,openat函數相當于open
      2. path參數指定的是相對路徑名,fd參數指出了相對路徑名在文件系統中的開始地址。fd參數是通過打開相對路徑名所在的目錄來獲取
      3. path參數指定的是相對路徑名,fd參數具有特殊值AT_FDCWD。在這種情況下,路徑名在當前工作目錄中獲取,openat函數在操作上和open函數相似
  • 函數creat---創建文件

    int creat(const char *path, mode_t mode)
        返回值:若成功,返回為只寫打開的文件描述符。若出錯,返回-1
    
  • 函數close---關閉文件

    int close(int fd)
        返回值:若成功,返回0。若出錯,返回-1
    
    • 關閉一個文件時會釋放該進程加在改文件上的所有記錄鎖
  • 函數lseek---顯示地為一個打開文件設置偏移量

    off_t lseek(int fd, off_t offset, int whence)
        返回值:若成功,返回新的文件偏移量。若出錯,返回-1
    

    對參數offset的解釋和參數whence的值有關

    • 若whence = SEEK_SET,則將該文件的偏移量設置為距文件開始處offset個字節
    • 若whence = SEEK_CUR,則將該文件的偏移量設置為其當前值加offset,offset可正可負
    • 若whence = SEEK_END,則將該文件的偏移量設置為文件長度加offset,offset可正可負
  • 函數read---讀數據

    ssize_t read(int fd, void *buf,size_t nbytes)
        返回值:讀到的字節數,若已到文件尾,返回0。若出錯,返回-1
    
    • 有多種情況可使實際讀到的字節數少于要求讀的字節數
  • 函數write---寫數據

    ssize_t write(int fd, const void *buf,size_t nbytes)
        返回值:若成功,返回已寫的字節數。若出錯,返回-1
    
  • 單個進程打開文件時內核數據結構圖

image
  • 兩個獨立進程各自打開了同一個文件,有如下關系圖
image
  • 多個進程讀取同一文件都能正常工作。每個進程都有它自己的文件表項,其中也有它自己的當前文件偏移量。但是,當多個進程寫同一個文件時,則可能產生預想不到的結果

  • 原子操作指的是由多步組成的一個操作,如果原子操作被執行,要么執行完所有步驟,要么一步也不執行,不可能執行所有步驟中的一個子集

  • 函數dup和dup2---復制一個現有的文件描述符

    int dup(int fd)
    
    int dup2(int fd,int fd2);
        返回值:若成功,返回新的文件描述符。若出錯,返回-1
    
    • fd---將要復制的文件描述符
    • fd2---指定新描述符的值(將要返回的)
    • dup返回的新文件描述符一定是當前可用文件描述符中的最小數值
    • dup2是一個原子操作,
    close(fd2);
    fcntl(fd,F_DUPFD,fd2);
    
  • 函數fcntl---改變打開已經打開的文件的屬性

    int fcntl(int fd, int cmd, .../* int arg */)
        返回值:若成功,則依賴于cmd。若出錯,返回-1
    
    • fcntl有以下5中功能
      • 復制一個已有的描述符(cmd = F_DUPFD 或 F_DUPFD_CLOEXEC)
      • 獲取/設置文件描述符標志(cmd = F_GETFD 或 F_SETFD)
      • 獲取/設置文件狀態標志(cmd = F_GETFL 或 F_SETFL)
      • 獲取/設置異步I/O所有權(cmd = F_GETOWN 或 F_SETOWN)
      • 獲取/設置記錄鎖(cmd = F_GETLK、F_SETLK 或 F_SETLKW)
    • 在修改文件描述符標志或文件狀態標志時必須謹慎,先要獲得現在的標志值,然后按照期望修改,最后設置新標志值。不能只執行F_SETFD或F_SETFL命令,這樣會關閉以前設置的標志位
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,791評論 6 545
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,795評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,943評論 0 384
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 64,057評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,773評論 6 414
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,106評論 1 330
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,082評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,282評論 0 291
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,793評論 1 338
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,507評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,741評論 1 375
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,220評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,929評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,325評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,661評論 1 296
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,482評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,702評論 2 380

推薦閱讀更多精彩內容

  • 本文摘抄自linux基礎編程 IO概念 Linux的內核將所有外部設備都可以看做一個文件來操作。那么我們對與外部設...
    VD2012閱讀 1,025評論 0 2
  • 大綱 一.Socket簡介 二.BSD Socket編程準備 1.地址 2.端口 3.網絡字節序 4.半相關與全相...
    VD2012閱讀 2,421評論 0 5
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,366評論 0 6
  • 1.文件描述符 所有執行I/O操作的系統調用都以文件描述符(一個非負整數)來指代打開的文件。文件描述符用以表示所有...
    666真666閱讀 1,128評論 0 2
  • 文殊菩薩,梵名Ma?ju?rī[1] ,音譯作文殊師利、曼殊室利、滿祖室哩,意譯為妙德、妙吉祥、妙樂、法...
    060宋丹閱讀 621評論 0 2