前言
當開啟一個檔案的時候,我們需要指定開啟檔案的模式( 只讀,只寫等 )。那麼在程式中如何獲取,修改這個檔案的狀態標誌呢?
本文將告訴你如何用 fcntl函式 獲取指定檔案的狀態標誌。
解決思路
1. 對於獲取檔案狀態標誌,我們可以通過呼叫fcntl函式得到一個記錄檔案標誌的整型變數,然後分別讓它和各個狀態標誌常量進行&操作。若操作結果為正則檔案具有此狀態標誌,否則檔案沒有此狀態標誌。( 如果是檢查只讀,只寫,可讀可寫,則需要和ACCMODE相&,然後判斷其結果是否為O_RDONLY,O_WRONLY,O_RDWR)。
2. 對於增加檔案狀態標誌,我們可以先呼叫fcntl函式得到一個記錄檔案標誌的整型變數,然後讓它 |= 你想為其增設的狀態標誌,最後再呼叫fcntl函式儲存這個標誌。
3. 對於刪除檔案狀態標誌,我們可以先呼叫fcntl函式得到一個記錄檔案標誌的整型變數,然後讓它 &= 你想為其增設的狀態標誌的~,最後再呼叫fcntl函式儲存這個標誌。
PS:呼叫fcntl函式需要包含 fcntl.h 標頭檔案
示例程式碼 - 獲取檔案的狀態標誌
1 #include "apue.h" 2 #include <fcntl.h> 3 4 int 5 main(int argc, char *argv[]) 6 { 7 int val; 8 9 // 以檔案標誌符作引數 10 if (argc != 2) 11 err_quit("usage: a.out <descriptor#>"); 12 13 // 將字串型別的檔案標誌符轉換成整型 14 if ((val = fcntl(atoi(argv[1]), F_GETFL, 0)) < 0) 15 err_sys("fcntl error for fd %d", atoi(argv[1])); 16 17 /* 18 * 下段程式碼檢測識別符號對應檔案的讀寫屬性 19 */ 20 switch (val & O_ACCMODE) { 21 case O_RDONLY: 22 printf("read only"); 23 break; 24 25 case O_WRONLY: 26 printf("write only"); 27 break; 28 29 case O_RDWR: 30 printf("read write"); 31 break; 32 33 default: 34 err_dump("unknown access mode"); 35 } 36 37 /* 38 * 下段程式碼檢測識別符號對應檔案的其他屬性 39 */ 40 if (val & O_APPEND) 41 printf(", append"); 42 if (val & O_NONBLOCK) 43 printf(", nonblocking"); 44 45 // 對於定義了O_SYNC標誌的系統檢測該標誌 46 #if defined(O_SYNC) 47 if (val & O_SYNC) 48 printf(", synchronous writes"); 49 #endif 50 #if !defined(_POSIX_C_SOURCE) && defined(O_FSYNC) 51 if (val & O_FSYNC) 52 printf(", synchronous writes"); 53 #endif 54 putchar('\n'); 55 exit(0); 56 }
示例程式碼 - 增加檔案的狀態標誌
1 #include "apue.h" 2 #include <fcntl.h> 3 4 void 5 set_fl(int fd, int flags) 6 { 7 int val; 8 9 // 獲取記錄狀態標誌的整型變數 10 if ((val = fcntl(fd, F_GETFL, 0)) < 0) 11 err_sys("fcntl F_GETFL error"); 12 13 // 增加狀態標誌 14 val |= flags; 15 16 // 儲存狀態標誌 17 if (fcntl(fd, F_SETFL, val) < 0) 18 err_sys("fcntl F_SETFL error"); 19 }
示例程式碼 - 刪除檔案的狀態標誌
1 #include "apue.h" 2 #include <fcntl.h> 3 4 void 5 set_fl(int fd, int flags) 6 { 7 int val; 8 9 // 獲取記錄狀態標誌的整型變數 10 if ((val = fcntl(fd, F_GETFL, 0)) < 0) 11 err_sys("fcntl F_GETFL error"); 12 13 // 刪除狀態標誌 14 val &= ~flags; 15 16 // 儲存狀態標誌 17 if (fcntl(fd, F_SETFL, val) < 0) 18 err_sys("fcntl F_SETFL error"); 19 }
說明
fcntl函式的功能遠不及此,其他的功能會隨著學習的深入再做講解。