第七篇:使用 fcntl 函式 獲取,設定檔案的狀態標誌

穆晨發表於2017-01-28

前言

       當開啟一個檔案的時候,我們需要指定開啟檔案的模式( 只讀,只寫等 )。那麼在程式中如何獲取,修改這個檔案的狀態標誌呢?

       本文將告訴你如何用 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函式的功能遠不及此,其他的功能會隨著學習的深入再做講解。

相關文章