一、什麼是檔案
在講述檔案操作之前,我們首先要知道什麼是檔案。看到這個問題你可能會感覺到可笑,因為對於用過電腦的人來說,檔案是最簡單不過的概念了,例如一個文本是一個檔案,一個work文檔是一個檔案等。但是在Linux中,檔案的概念還遠不止於這些,在Linux中,一切(或幾乎一切)都是檔案。檔案包括很多的內容,例如:大家知道的普通檔案是檔案,目錄也是一個檔案,裝置也是一個檔案,管道也是一個檔案等等。對於目錄、裝置這些的操作也可以完全等同於對純文字檔案的操作,這也是Linux非常成功的特性之一吧。
二、系統調用
1、檔案描述符
檔案描述符是一些小數值,你可以通過它們訪問的開啟的檔案裝置,而有多少檔案描述符可用取決於系統的配置情況。但是當一個程式開始運行時,它一般會有3個已經開啟的檔案描述符,就是
0:標準輸入
1:標準輸出
2:標準錯誤
那些數學(即0、1、2)就是檔案描述符,因為在Linux上一切都是檔案,所以標準輸入(stdin),標準輸出(stdout)和標準錯誤(stderr)也可看作檔案來對待。
2、系統調用常用函數
A、open系統調用
open函數的原型為:
int open(const char *path, int oflags);
int open(const char *path, int oflags, mode_t mode);
path,是包括路徑的完整檔案名稱,oflags是檔案訪問模式(即是什麼方式開啟檔案,唯讀、唯寫還是可讀並可寫等),mode用於設定檔案的存取權限。具體的選擇性參數,可以自己查看手冊頁,這裡不一一詳述。
open建立了一條到檔案或裝置的訪問路徑,如果調用成功,返回一個可以被read、write等其他系統調用的函數使用的檔案描述符,而且這個檔案描述是唯一的,不與任何其他運行中的進程共用,在失敗時返回-1,並設定全域變數errno來指明失明的原因。
B、write系統調用
write函數的原型為:
size_t write(int fildes, const void *buf, size_t nbytes);
write的作用是把緩衝區buf的前nbytes個位元組寫入到檔案描述符fildes關聯的檔案中,返回實際寫入的位元組數。返回0表示沒有寫入任何資料,返回-1表示調用中出現了錯誤,錯誤碼儲存在errno中。
註:fildes一定要是在open調用中返回的建立的檔案描述符,或者是0、1、2等標準輸入、輸出或標準錯誤。
C、read系統調用
read函數的原型為:
size_t read(int fildes, void *buf, size_t nbytes);
read系統調用的作用是從與檔案描述符相關的檔案裡讀入nbytes個位元組的資料,並把它們放到資料區buf中,返回讀入的位元組數,失敗時返回-1。
D、close系統調用
close調用的函數原型為:
int close(int fildes);
close函數的作用是終於檔案描述符fildes一其對應的檔案之間的關聯。
E、例子
說了這麼多,我就給出一個完整的例子吧,就是從一個資料檔案(裡面有1M個‘0’字元)逐個複製到別一個檔案。檔案名稱為copy_system.c,代碼如下:
#include <unistd.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> int main() { char c = '\0'; int in = -1, out = -1; //以唯讀方式開啟資料檔案 in = open("Data.txt", O_RDONLY); //以唯寫方式建立檔案,如果檔案不存在就建立一個新的檔案 //檔案屬主具有讀和寫的許可權 out = open("copy_system.out.txt", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR); while(read(in, &c, 1) == 1)//讀一個位元組的資料 write(out, &c, 1);//寫一個位元組的資料 //關閉檔案描述符 close(in); close(out); return 0; }