《Unix環境進階編程》讀書筆記 第3章-檔案I/O,unix環境進階編程

來源:互聯網
上載者:User

《Unix環境進階編程》讀書筆記 第3章-檔案I/O,unix環境進階編程
1. 引言

  • 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:建立或開啟一個檔案

  • oflag參數

  • openat函數是POSIX.1最新版本中新增的一類函數之一,希望解決兩個問題:

  • TOCTTOU錯誤的基本思想是:

    指電腦系統的資料與許可權等狀態的檢查與使用之間,因為特定狀態在這段時間已發生改變所產生的軟體漏洞

  • 檔案名稱和路徑名截斷

4. 函數creat:建立一個新檔案

  • 等效於 open( path, O_WRONLY | O_CREAT | O_TRUNC, mode );
  • creat的一個不足之處是它以唯寫方式開啟所建立的檔案
5. 函數close

  • 關閉一個檔案時會釋放該進程加在該檔案的所有記錄鎖
  • 當一個進程終止時,核心自動關閉它所有的開啟檔案
6. 函數lseek:為一個開啟檔案設定位移值

  • 每個開啟檔案(通過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

  • 讀操作從檔案的當前位移處開始,在成功返回之前,該位移量將增加實際讀到的位元組數
  • 多種情況下使得讀到的位元組數少於要求讀的位元組數
8. 函數write

  • 其傳回值通常與參數nbytes的值相同,否則表示錯誤。
  • 對於普通檔案,寫操作從檔案的當前位移處開始。如果在開啟檔案時,指定了O_APPEND選項,則在每次寫操作之前,將檔案位移量設定在檔案的當前結尾處
9. I/O的效率
  • 大多數檔案系統為改善效能都採用某種預讀技術
10. 檔案分享權限設定
  • 核心使用3種資料結構表示開啟檔案,它們之間的關係決定了在檔案分享權限設定方面一個進程對另一個進程可能產生的影響

    左邊:進程級的檔案描述符表

  • 中間:系統級的開啟檔案表:每次調用open開啟一個檔案新增一個檔案表項(不同進程可開啟同一個檔案,導致多個檔案表項)

  • 右邊:檔案系統級的i-node表

  • 其他

11. 原子操作
  • 先lseek再write,不等價於,指定了O_APPEND的write
  • 對open函數指定O_CREAT和O_EXCL

  • 函數pread、pwrite


  • 調用pread相當於調用lseek後調用read,但又有區別:

  • 調用pwrite相當於調用lseek後調用write,也有類似的區別

12. 函數dup、dup2

  • dup返回的新檔案描述符一定是當前可用檔案描述符的最小數值
  • dup2可以用fd2參數指定新描述符的值

  • dup(fd); 等價於 fcntl(fd, F_DUPFD, 0);

  • dup2(fd, fd2); 不完全等價於 close(fd2); fcntl(fd, F_DUPFD, fd2); 因為其非原子操作,且dup2和fcntl有一些不同的errno
13. sync、fsync、fdatasync
  • 傳統的Unix系統實現在核心中設有緩衝區快取或頁快取,大多數磁碟I/O都通過緩衝區進行。當我們向檔案寫入資料時,核心通常先將資料複製到緩衝區中,然後排入隊列,晚些時候再寫入磁碟。這種方式被稱為延遲寫
14. 函數fcntl:改變已開啟檔案的屬性

  • fcntl函數有以下5種功能

  • 先通過GET擷取得到val,再 val |= flags; 或 val &= ~flags; 最後通過SET將val設定到fd

15. 函數ioctl

  • 通常有另外一個參數,它常常是指向一個變數或結構的指標
  • 上面原型中只include了ioctl函數本身需要的標頭檔。通常,需要另外的裝置專用標頭檔,如:終端I/O的ioctl命令都需要標頭檔termios.h
16. /dev/fd
  • 開啟檔案/dev/fd/n等效於複製描述符n(假設描述符n是開啟的)
  • Linux實現中的/dev/fd是個例外,它把檔案描述符映射成指向底層物理檔案的符號連結,例如,當開啟/dev/fd/0時,事實上正在開啟與標準輸入關聯的檔案

[wulin@localhost ~]$ ls /dev/fd/ -l
lrwx------. 1 wulin wulin 64 7月 29 10:28 0 -> /dev/pts/0
lrwx------. 1 wulin wulin 64 7月 29 10:28 1 -> /dev/pts/0
lrwx------. 1 wulin wulin 64 7月 29 10:28 2 -> /dev/pts/0
lr-x------. 1 wulin wulin 64 7月 29 10:28 3 -> /proc/5341/fd

[wulin@localhost ~]$ ls /dev/std* -l
lrwxrwxrwx. 1 root root 15 7月 29 2014 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 7月 29 2014 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 7月 29 2014 /dev/stdout -> /proc/self/fd/1

  • /dev/fd檔案主要由shell使用,它允許使用路徑名作為調用參數的程式,能用處理其他路徑名的相同方式處理標準輸入和輸出。
 
  • filter file2 | cat file1 - file3 | lpr 首先cat讀file1,然後讀其標準輸入(filter file2命令的輸出),然後讀file3
  • 如果支援/dev/fd,則可以刪除cat對“-”的特殊處理,於是可以: filter file2 | cat file1 /dev/fd/0 file3 | lpr
  • 作為命令後參數的“-”特指標準輸入或標準輸出,這已被很多程式採用。但是這會帶來一些問題,例如,如果用“-”指定第一個檔案,那麼看來就像指定了命令列的一個選項

在linux下怎使用《UNIX環境進階編程》裡面的“ourhdrh“這檔案?

未定義。。。。
blog.csdn.net/xuorui/article/details/5447555
其實就是源碼的編譯和include
看看上面的網站能否解決
如果 無法解決
g o o g l e
apue源碼編譯
作者寫的標頭檔麼 。。。
 
誰好的linux學習網站,分享一些

verycd上很多教程 linuxsir上也有很多文章
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.