1. 程式人生 > 其它 >Unix/Linux實踐-檔案操作-02

Unix/Linux實踐-檔案操作-02

who

在Unix中,任何可以被 shell 解釋的命令都是一個其他人編寫的程式。

who 用來檢視當前登入系統的使用者數量及其資訊。

man 命令 用來檢視特定命令的詳細資訊,包括所有後面可以緊跟的所有引數,每個引數的具體功能、用法等等。

who 的原理:who命令顯示出的資訊是通過讀取某個檔案實現的,該檔案記錄所有已登入使用者的資訊。該檔名稱為utmp

read將一定數目的位元組讀入到緩衝區,需要一個檔案描述符作為引數。
read(int fd, void *buf, size_t n) 從fd指定的檔案中讀取n個位元組放到buf指向的記憶體空間中。讀取成功會返回讀取的字
節數(檔案剩餘的位元組數可能少於指定的位元組數),否則返回-1。

open在程序和檔案之間建立一條連線,該連線稱為檔案描述符。
open(char *name, int how)接收一個檔名和預定義的開啟模式,若正常開啟,返回一個整數值,即檔案描述符;否則返回-1。開啟多個檔案或者同一個檔案被開啟多次,檔案描述符都不相同。

close(int fd)關閉fd表示的程序和某個檔案的連線。失敗則返回-1。

create(char *filename, mode_t mode)建立一個檔名為filename的檔案。如果檔案不存在,則建立,許可權設為mode;如果存在,則清空該檔案,將其許可權設為mode。

write(int fd, char *buf, int n)

將buf指向的記憶體空間中的n個位元組數寫入到fd表示的檔案中。寫入成功返回實際寫入的位元組數,否則返回-1.呼叫之後需要比較返回值和n的大小檢查是否真正寫入成功。

普通程式進行檔案操作,只能通過核心提供的系統呼叫進行。執行系統呼叫時,需要將執行模式切換到核心狀態,呼叫完成後切換回使用者狀態。這種切換狀態需要的時間開銷相對較大,若經常進行這種切換操作,則時間開銷會很大。儘量使用緩衝技術減少系統呼叫的次數。

通常情況下,使用者程式和磁碟上的檔案進行互動需要使用緩衝區提高訪問速度。使用者讀磁碟上的檔案的順序為,使用者從核心緩衝區尋找該檔案,如果沒有,則使用者程序掛起,等待核心從磁碟中將該檔案讀入到核心的緩衝區中,然後將其從核心緩衝區複製到使用者緩衝區中;如果有,直接將其從核心緩衝區複製到使用者緩衝區中。寫檔案也是將其從使用者緩衝區寫入到核心緩衝區中,在某個特定的時間點核心將其從核心緩衝區寫入到磁碟中。

讀寫檔案的時候,每個檔案描述符都有一個與之關聯的指標。首次開啟(或者建立並開啟)檔案時,指標指向檔案的開頭,當讀寫操作時,該指標移動到下一個未被讀取寫入的字元位置。

lseek(int fd, int offset, int base)fd表示和檔案關聯的檔案描述符,base表示指標移動的基準點,基準點有三個,分別是檔案開始(0)、當前位置(1)和檔案結尾(3)。offset表示相對於基準點的位移量。將檔案中的指標移動到base+offset表示的位置。