一、檔案描述符
對於Linux而言,所有對裝置或檔案的操作都是通過檔案描述符進行的。當開啟或者建立一個檔案的時候,核心向進程返回一個檔案描述符(非負整數)。後續對檔案的操作只需通過該檔案描述符,核心記錄有關這個開啟檔案的資訊(file結構體)。
一個進程啟動時,預設開啟了3個檔案,標準輸入、標準輸出、標準錯誤,對應檔案描述符是0(STDIN_FILENO)、1(STDOUT_FILENO)、2(STDERR_FILENO),這些常量定義在unistd.h標頭檔中。
fileno:將檔案指標轉換為檔案描述符
fdopen:將檔案描述符轉換為檔案指標
二、什麼是I/O
輸入/輸出是主存和外部裝置之間拷貝資料的過程
裝置->記憶體 (輸入操作)
記憶體->裝置 (輸出操作)
進階I/O
ANSI C提供的標準I/O庫稱為進階I/O,通常也稱為帶緩衝的I/O
低級I/O
通常也稱為不帶緩衝的I/O
三、檔案的開啟關閉
open系統調用1:
函數原型
int open(const char *path, int flags);
參數
path :檔案的名稱,可以包含(絕對和相對)路徑
flags:檔案開啟模式
傳回值:
開啟成功,返迴文件描述符;開啟失敗,返回-1
open系統調用2:
函數原型
int open(const char *path, int flags,mode_t mode);
參數
path :檔案的名稱,可以包含(絕對和相對)路徑
flags:檔案開啟模式
mode: 用來規定對該檔案的所有者,檔案的使用者組及系 統中其他使用者的存取權限
傳回值:
開啟成功,返迴文件描述符;開啟失敗,返回-1
開啟檔案的方式:
O_RDONLY 開啟一個供讀取的檔案
O_WRONLY 開啟一個供寫入的檔案
O_RDWR 開啟一個可供讀寫的檔案
O_APPEND 寫入的所有資料將被追加到檔案的末尾
O_CREAT 開啟檔案,如果檔案不存在則建立檔案
O_EXCL 如果已經置O_CREAT且檔案存在,則強制open() 失敗
O_TRUNC 在open() 時,將檔案的內容清空
存取權限:
S_IRUSR 檔案所有者的讀許可權位
S_IWUSR 檔案所有者的寫入權限位
S_IXUSR 檔案所有者的執行許可權位
S_IRWXU S_IRUSR | S_IWUSR | S_IXUSR
S_IRGRP 檔案使用者組的讀許可權位
S_IWGRP 檔案使用者組的寫入權限位
S_IXGRP 檔案使用者組的執行許可權位
S_IRWXG S_IRGRP | S_IWGRP | S_IXGRP
S_IROTH 檔案其他使用者的讀許可權位
S_IWOTH 檔案其他使用者的寫入權限位
S_IXOTH 檔案其他使用者的執行許可權位
S_IRWXO S_IROTH | S_IWOTH | S_IXOTH
為了重新利用檔案描述符,用close()系統調用釋放開啟的檔案描述符
函數原型:int close(int fd);
函數參數:
fd :要關閉的檔案的檔案描述符
傳回值:
如果出現錯誤,返回-1;調用成功返回0
樣本程式如下:
C++ Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
|
/************************************************************************* > File Name: file_oper.c > Author: Simba > Mail: dameng34@163.com > Created Time: Sat 23 Feb 2013 02:34:02 PM CST ************************************************************************/ #include<sys/types.h> #include<sys/stat.h> #include<unistd.h> #include<fcntl.h> #include<stdio.h> #include<stdlib.h> #include<errno.h> #include<string.h>// #define ERR_EXIT(m) (perror(m), exit(EXIT_FAILURE)) #define ERR_EXIT(m) \ do { \ perror(m); \ exit(EXIT_FAILURE); \ } while(0) /* fileno:將檔案指標轉換為檔案描述符 * fdopen:將檔案描述符轉換為檔案指標 */ int main(void) { printf("fileno(stdin) = %d\n", fileno(stdin)); int fd; /* fd = open("test.txt", O_RDONLY); if (fd == -1) { // perror("open error"); fprintf(stderr, "open error with errno=%d:%s\n", errno, strerror(errno)); exit(EXIT_FAILURE); } */ /* if (fd == -1) ERR_EXIT("open error"); printf("open success.\n"); */ umask(0); //不繼承shell的umask值,重新設定為0; newmode = mode & ~umask fd = open("test.txt", O_WRONLY | O_CREAT, 0666); if (fd == -1) ERR_EXIT("open error"); printf("open success.\n"); close(fd); return 0; } |
輸出為:
fileno(stdin) = 0
open success.
需要說明的是,在linux系統編程中使用的一些系統調用函數一般如果失敗返回-1且會置全域變數errno為特定的錯誤碼,可以使用perror列印,或者通過strerror(errno)列印錯誤提示。
參考:《APUE》