2011-06-30 126 views
7

我想了解該統計命令的stat結構的st_mode字段的標誌,但我有這麼難!我發現這個例子here,但我真的不明白這個代碼片段:統計系統調用st_mode的標誌

if (mode & S_IRUSR) str[1] = 'r'; /* 3 bits for user */ 
if (mode & S_IWUSR) str[2] = 'w'; 
if (mode & S_IXUSR) str[3] = 'x'; 

if (mode & S_IRGRP) str[4] = 'r'; /* 3 bits for group */ 
if (mode & S_IWGRP) str[5] = 'w'; 
if (mode & S_IXGRP) str[6] = 'x'; 

if (mode & S_IROTH) str[7] = 'r'; /* 3 bits for other */ 
if (mode & S_IWOTH) str[8] = 'w'; 
if (mode & S_IXOTH) str[9] = 'x'; 

我知道「&」是按位與運算,但沒有別的。我甚至不知道該問什麼。

PD:抱歉,我問過以前的問題。我不知道如何標記回答的問題或類似的東西:(

回答

2

模式是一個bitfield這是一種常見的數據打包方式。想想現場的每一位是可以設置的切換開關要關閉或要檢查是否切換時,您檢查,看看是否合適的位已經使用&運營商設置可以設置使用位|以及使用清除它們〜bitwise operations

1

好了,POSIX spec for <sys/stat.h>。列舉你可以從struct stat的st_mode字段中學到的所有東西。

是你的問題「這個字段告訴我什麼」,或者是它「我如何提取信息」,或兩者兼而有之?

2

在操作系統編程中使用無符號整數來保存一系列描述某些內容的位是很常見的。在這種情況下,模式有9位感興趣。有一點告訴所有者是否可以讀取,一個用於所有者寫入,一個用於執行所有者,以及該組和其他人的相似位。訣竅在於提取是否設置了一位。

下面是一個例子。 S_IRUSR是描述「所有者讀取」位的位掩碼的名稱。它在the specs中定義爲0400(八進制),其轉換爲二進制的100000000。當您使用掩碼獲取二進制值和該值時,如果掩碼的第9位被設置,則會得到值100000000(二進制)。否則,您得到0.

如果返回大值,if語句的計算結果爲true,否則返回false。這樣,如果該位被設置,'r'被寫入到位置1的字符串中。同樣的技術也適用於所有其他位。

+0

謝謝,我不知道它是八進制的,所以我的程序沒有工作! :-) – Gandaro