第 28 章 檔案與I/O

目錄

1. 彙編程序的Hello world
2. C標準I/O庫函數與Unbuffered I/O函數
3. open/close
4. read/write
5. lseek
6. fcntl
7. ioctl
8. mmap

從本章開始學習各種Linux系統函數,這些函數的用法必須結合Linux內核的工作原理來理解,因為系統函數正是內核提供給應用程序的介面,而要理解內核的工作原理,必須熟練掌握C語言,因為內核也是用C語言寫的,我們在描述內核工作原理時必然要用“指針”、“結構體”、“鏈表”這些名詞來組織語言,就像只有掌握了英語才能看懂英文書一樣,只有學好了C語言才能看懂我描述的內核工作原理。讀者看到這裡應該已經熟練掌握了C語言了,所以應該有一個很好的起點了。我們在介紹C標準庫時並不試圖把所有庫函數講一遍,而是通過介紹一部分常用函數讓讀者把握庫函數的基本用法,在掌握了方法之後,書上沒講的庫函數讀者應該自己查Man Page學會使用。同樣,本書的第三部分也並不試圖把所有的系統函數講一遍,而是通過介紹一部分系統函數讓讀者理解操作系統各部分的工作原理,在有了這個基礎之後就應該能夠看懂Man Page學習其它系統函數的用法。

讀者可以結合[APUE2e]學習本書的第三部分,該書在講解系統函數方面更加全面,但對於內核工作原理涉及得不夠深入,而且假定讀者具有一定的操作系統基礎知識,所以並不適合初學者。該書還有一點非常不適合初學者,作者不辭勞苦,在N多種UNIX系統上做了實驗,分析了它們的內核代碼,把每個系統函數在各種UNIX系統上的不兼容特性總結得非常詳細,很多開發者需要編寫可移植的應用程序,一定愛死他了,但初學者看了大段大段的這種描述(某某函數在4.2BSD上怎麼樣,到4.4BSD又改成怎麼樣了,在SVR4上怎麼樣,到Solaris又改成怎麼樣了,現在POSIX標準是怎麼統一的,還有哪些系統沒有完全遵守POSIX標準)只會一頭霧水,不看倒還明白,越看越不明白了。也正因為該書要兼顧各種UNIX系統,所以沒法深入講解內核的工作原理,因為每種UNIX系統的內核都不一樣。而本書的側重點則不同,只講Linux平台的特性,只講Linux內核的工作原理,涉及體繫結構時只講x86平台,對於初學者來說,綁定到一個明確的平台上學習就不會覺得太抽象了。當然本書的代碼也會儘量兼顧可移植性,避免依賴于Linux平台特有的一些特性。