2010-02-18 89 views
1

我正在進行網絡任務,我們的任務是使用我們提供的協議創建遠程文件訪問服務器。我可能遇到的困難來自缺少的信息,這些信息解釋了計算open()中oflag參數位的過程。如何計算open()中oflag的位標誌/枚舉標誌?

我從客戶端收到一條消息以打開一個文件,並在消息中解析用於inlag的標誌字符。具體而言,他們是:

  • 的R - O_RDONLY
  • W - O_WRONLY
  • RW - O_RDWR
  • A - O_APPEND
  • Ç - O_CREAT
  • 筆 - O_TRUNC
  • ë - O_EXCL

我繞過谷歌和s獲取按位操作,枚舉標誌,位標誌,計算位標誌等,並找不到有助於確定如何爲oflag創建位的內容。也許我只是不知道我在找什麼,並忽略了有用的信息?

可能有人請:

  • 點我的方向/提供連結到如何計算比特/#我應該文檔/例子投入給我分析人物或
  • oflags告訴我枚舉類型的標誌,他們應該排序進去

多謝您的幫助,如果我不是我的問題還是什麼,我試圖做明確的,只是讓我知道,我將盡快澄清。

回答

3

O_...標誌是每個具有不同的單個位集的數字。例如我的系統上它們在fcntl.h作爲

#define O_RDONLY    00 
#define O_WRONLY    01 
#define O_RDWR    02 
#define O_CREAT   0100 /* not fcntl */ 
#define O_EXCL    0200 /* not fcntl */ 
#define O_NOCTTY   0400 /* not fcntl */ 
#define O_TRUNC   01000 /* not fcntl */ 
#define O_APPEND   02000 

您使用|(邏輯OR)的標誌是一個數字與您希望每個選項中設置的所有位結合,並傳遞給open定義。所以例如open("file", O_RDWR | O_CREAT)

如果需要,您可以計算一個int並將其傳遞給open。

int flags = 0; 
if (...) 
    flags |= O_RDWR; 
... 
open('file', flags); 
+0

因此,例如,如果我解析RWC,然後將打開(「文件」,O_RDWR | O_CREAT)。但既然只知道字符,我會做int oflag =(02 | 0100),然後我打開看起來像打開(「文件」,oflag)?我需要從我解析到的二進制角色中解脫出來。 – Chris 2010-02-18 23:01:11

0

通常的表達式會像O_RDWR | O_CREAT。並注意O_RDWR正是O_RDONLY | O_WRONLY

你可以做這樣的事情:

char *flags = "r"; 
int oflag = 0; 

if (strchr(flags,'r')) oflag |= O_RDONLY; 

等爲標誌的其餘部分。

+0

嗯......也許我是一個小混亂。假設我想用O_WRONLY |打開一個文件O_CREAT | O_APPEND,那裏,我該如何計算一些int/bits放入?例如,我可以輸入與那些flgas相對應的open(「myfile」,)嗎? – Chris 2010-02-18 22:27:04

+0

@Chris:使用標誌,而不是數字。在這種情況下,您可以使用open(「myfile」,O_WRONLY | O_CREAT | O_APPEND)。如果沒有其他的話,閱讀起來會更容易。 – 2010-02-18 23:02:35

+1

使用標誌......這些標誌位並不是全部標準化的,所以你不能假定它們在每個平臺上都有相同的值。此外,符號形式更具可讀性,因此可以維護...源代碼是爲了您的利益,而不是機器的。 – 2010-02-18 23:40:01