談linux下的檔案操作,我們首先需要了解程序表,這是被每個程序所維護的一張開啟檔案的對映表,參照下圖。
索引值是檔案描述符,與之相關聯的節點包含fd flag以及乙個指向file table的指標。其中fd flag主要包含close-on-exec標記,該標記的作用在於當開闢其他程序呼叫exec()族函式時,如果該標記的最後一位被置1,則在呼叫exec函式之前將為exec族函式釋放對應的檔案描述符。而其後的指標指向的是乙個file table。該節點時被kernel所維護的,它包含了當前檔案的一些開啟資訊,offset值以及乙個指向v節點的指標(在linux中是泛化的i節點)。
v-node-table是從硬碟上載入的,而v節點包含的是主要是檔案的型別資訊,其後跟隨的是i節點,它包含檔案的大小,屬主,以及指向資料塊節點的指標等資訊。
不同的程序是可以共享同樣的檔案的。
從上圖可以看出,這兩個程序雖然指向不同的file table表(這允許它們擁有不同的開啟型別以及offset值等),但是,它們都指向同樣的v-node table。
當然,我們也可以通過dup等函式實現讓同乙個程序內的不同檔案描述符關聯上相同的file table,也就是說offset值將被它們共享。
需要我們注意的是,file table是被kernel所維護的,因此,不同的程序是可以共享file table的,實際上父子程序在預設下就是共享file table的。預設的(通過shell),所有的程序在一開始的時候,其程序表都會被填上3個值,即0,1,2.它們分別與標準輸入,標準輸出,以及標準錯誤相關聯。而且,這些程序關於這些檔案全都共享相同的file table,如下圖所示。
linux的檔案操作可以使用系統呼叫或是庫函式,這裡只簡單介紹下系統呼叫,它們都是無快取io。
首先是open函式,用於開啟檔案,它的返回值是檔案描述符。看起宣告:
int open(const char *pathname, int oflag, ... /* mode_t mode */ );
第乙個引數時檔案路徑,第二個引數是開啟方式(如唯讀,只寫等),如果第二個引數還同時指定了新建,則可通過第三個引數指定檔案的許可權等值。
然後是lseek函式,用於指定offset值。其宣告如下:
off_t lseek(int filedes, off_t offset, int whence);
第二個引數是偏移量,第三個引數是偏移基點(可取值:seek_set[檔案開始位置]、seek_cur[當前位置]、seek_end[檔案結束位置])在偏移基點取第乙個值時,offset只能去整數,而取後兩者值時,則可正可負。
當然還有讀寫函式,這些都是沒有快取的。
原子性是指同乙個操作的不同邏輯部分要嘛全執行,要嘛全不執行,中間不允許被打斷。
同樣具有原子性的可替代讀寫函式有:
ssize_t pread(int filedes, void *buf, size_t nbytes, off_t offset);
ssize_t pwrite(int filedes, const void *buf, size_t nbytes, off_t offset);
前面說到,dup函式的作用是使不同的檔案描述符關聯上相同的file table,我們先看它的乙個宣告:
int dup2(int filedes, int filedes2);
該函式首先關閉filedes2(如果開啟了),然後令該檔案描述符關聯上與filedes同樣的filetable。
該操作是原子性,也就是說在關閉檔案描述符和關聯這兩個動作之間是不允許被打斷的。
Unix環境高階程式設計學習筆記 二
三種主要的標準 iso c ieee posix single unix specification xsi 一層一層遞增,ieee posix 是iso c的超集。xsi 是posix的超集。要想提高軟體的可移植性,就必須有限制 編譯時限制 因為某些限制是固定的,則可以在標頭檔案中定義。執行時限制...
UNIX環境高階程式設計學習筆記
include include include include int main int argc,char argv err sys can t open s argv 1 while dirp readdir dp null printf s n dirp d name closedir dp ...
UNIX環境高階程式設計學習筆記 程序
2.程序控制 在提出這個問題的時候,我想了一下,大概就是核心執行的乙個程式 錯誤回答 吧。但是這麼說,連我自己下次看都不明白在說什麼。於是我查了一下,它代表著cpu所能處理的單個任務,及執行例項。在面向程序設計的系統 如早期 unix,linux 2.4及更早版本中 程序是程式的基本執行實體 在面向...