本篇主要是針對linux中的檔案、目錄以及相關操作。主要介紹系統呼叫和標準i/o庫。linux中,一切都是以檔案的形式來表示的,包括一些硬體裝置。大多數情況下,只需要使用五個基本的函式--open close read write 和ioctl。目錄也是檔案,它用來儲存其他檔案的節點號(inode)和名字。正常情況下,所有使用者都必須用上層opendir/readdir介面來讀取目錄。檔案的一些屬性資訊都被儲存在檔案的inode資料結構中,它還包含檔案的長度和檔案在磁碟上的存放位置。
下面主要介紹下inode節點的一些資訊。
linux檔案系統(ext2)通常將檔案的屬性、許可權以及檔案的資料內容存放在不同的塊中,將檔案的屬性與許可權存放在inode中,實際資料則放置在data block塊中。還有乙個超級塊,會記錄整個檔案系統的整體資訊,包括inode與block的總量、使用量、剩餘量等。inode記錄檔案的屬性,乙個檔案占用乙個inode,同時記錄此檔案的資料所在的block號碼,而且每個inode的大小均為固定的128bytes(鳥哥是這麼說的,但是ubuntu系統中的inode大小為256b)。這樣就方便快速的查詢出資料,我們現找到檔案的inode然後知道了該檔案資料所在的塊,這樣就能快速的讀取資料
linux中比較重要的裝置檔案有三個--/dev/console /dev/tty /dev/null 第乙個是表示系統控制台,過去會有乙個指定的終端或者顯示器來接收控制台訊息,現在通常是虛擬控制台,比如在x視窗系統中,它是螢幕上的乙個特殊的控制台視窗,就是我們說的終端。/dev/tty。如果乙個程序有控制終端的話,那麼特殊檔案/dev/tty就是這個控制終端(鍵盤或者顯示屏,或者鍵盤和視窗)的別名(邏輯裝置)。
注意:雖然/dev/console裝置只有乙個,但是通過/dev/tty卻能夠訪問許多不同的物理裝置。
/dev/null是空裝置,所有寫向這個裝置的輸出都將被丟失。
我們用很少量的函式就可以對檔案和裝置進行訪問和控制,這些函式被稱為系統呼叫。
作業系統的核心,即核心,是一組裝置驅動程式。為了向使用者提供乙個統一的介面,裝置驅動程式封裝了所有與硬體相關的特性。硬體的特有功能可通過ioctl呼叫來完成。用來訪問裝置驅動程式的底層函式(系統呼叫)包括:
open:開啟檔案或裝置。
read:從開啟的檔案或裝置裡讀取資料
write:向檔案或裝置寫入資料
close:關閉檔案或裝置
ioctl:把控制資訊傳遞給裝置驅動程式
1.open系統呼叫。建立新的檔案描述符需要使用系統呼叫open。
#include #include #include int open(const char *path, int oflags)
int open(const char *path, int oflags, mode_t mode)
2.read系統呼叫。從與檔案描述符fildes相關聯的檔案裡讀入nbytes個位元組的資料,並把他們放到資料區buf中。它返回實際讀入的位元組數。
#include size_t read(int fildes, void *buf, size_t nbytes)
3.write系統呼叫。把緩衝區buf的前nbytes個位元組寫入與檔案描述符fildes關聯的檔案中。它返回實際寫入的位元組數。
#includesize_t write(int fildes, const void *buf, size_t nbytes);
4.close系統呼叫。終止乙個檔案描述符fildes與其對應檔案之間的關聯。檔案描述符被釋放並能夠重新使用。
#include int close(int fildes);
呼叫成功返回0 ,出錯返回-1.
5.ioctl系統呼叫。它提供乙個用於控制裝置及其描述符行為和配置底層服務的介面。
#include int ioctl(int fildes, int cmd, ...);
ioctl對描述符fildes指定的物件執行cmd引數中給出的操作。
其他與檔案管理有關的系統呼叫
1、lseek系統呼叫 對檔案描述符fildes的讀寫指標進行設定,可以用它來設定檔案的下乙個讀寫位置。
#include#include off_t lseek(int fildes, off_t offset, int whence);
offset引數用來指定位置,而whence引數定義該偏移值的用法。whence取如下值:seek_set:offset是乙個絕對位置。seek_cur:offset是相對於當前位置的乙個相對位置。 seek_end:offset是相對於檔案尾的乙個相對位置。lseek返回從檔案頭到檔案指標被設定處的位元組偏移值,失敗是返回-1。
2、fstat 、stat和lstat系統呼叫
fstat返回與開啟的檔案描述符相關的檔案的狀態資訊,該資訊將會寫到buf結構中,buf的位址以引數的形式傳遞給fstat
#include #include #include int fstat(int fildes, struct stat *buf);
int stat(const char *path, struct stat *buf);
int lstat(const char *path, struct stat *buf);
下面來介紹下標準i/o庫
標準i/o庫及其標頭檔案stdio.h已經是ansi c的一部分,而上述的系統呼叫還不是。在標準i/o庫中,與底層檔案描述符對應的叫做流(stream),它被實現為指向結構file的指標。在啟動程式時,有三個檔案流是自動開啟的,分別是stdin,stdout,stderr。下面將與系統呼叫相對應介紹fopen fclose fread fwrite
1.fopen
#include file *fopen(const char *filename, const char *mode);
它主要用於檔案和終端的輸入和輸出。
2.fread
#include size_t fread(void *ptr, size_t size, size_t nitems, file*stream);
從檔案流stream讀到由ptr指定的資料緩衝區裡,size引數指定每個資料記錄的長度,計數器nitems給出要傳輸的記錄個數。它的返回值是成功讀到資料緩衝區裡的記錄個數。
linux 第三章 檔案操作
1 生產任意大小的檔案 root localhost dd test root localhost dd test dd if dev zero of junk.data bs 1k count 10 10 0 records in 10 0 records out 10240 bytes 10 k...
Linux程式設計 學習筆記 第三章檔案操作
3.1 linux 檔案結構 linux中,一切都是檔案!一切!比較重要的三個裝置檔案 dev console 代表控制台 dev tty 代表控制終端 dev null 代表空,寫向這個裝置的資料都將被刪除。inode 檔案除了本身包含的內容以外,他還會有一些名字和屬性,即一些 管理資訊 如建立 ...
程式設計珠璣第三章
第三章寫的有點太簡單了,可能作者是想在後面章節裡再詳細說吧!這一章就是作者說的幾句話印象還是很深刻。程式設計師在節省空間方面無計可施時,將自己從 中解脫出來,退回起點並記者並集 中精力研究資料,常常能有奇效。資料的 表示形式是程式設計的根本。正如人月神話的作者說 只要給我你設計的表,我就對你的程式一...