2014-10-28 20 views
1

我有一個mode_t perms變量,它存儲從另一個函數返回的文件的權限。我需要打印文件的權限爲特林,形式如何將文件權限打印爲字符串?

rw-r--r-- (0644) 

的,但我得到的是

r--r--r-- (100644) 

我怎樣才能得到正確的權限?我試過Google搜索,並不明白我做錯了什麼。 這裏是我的代碼:

void print_perms(mode_t perms) 
    { 
     printf((perms & S_IRUSR) ? "r" : "-"); 
     printf((perms & S_IWUSR) ? "w" : "-"); 
     printf((perms & S_IXUSR) ? "x" : "-"); 
     printf((perms & S_IRGRP) ? "r" : "-"); 
     printf((perms & S_IWGRP) ? "w" : "-"); 
     printf((perms & S_IXGRP) ? "x" : "-"); 
     printf((perms & S_IROTH) ? "r" : "-"); 
     printf((perms & S_IWOTH) ? "w" : "-"); 
     printf((perms & S_IXOTH) ? "x" : "-"); 
    } 
//later 
print_perms(permissions); 
printf(" (%d)\n", permissions); 
+2

我懷疑你顯示的代碼是你有的代碼,因爲這不是一個有效的函數。請修改您的帖子以包含* actual *代碼。除此之外,這是很好的格式良好的第一個問題。 :) – 2014-10-28 18:44:47

+0

請注意,在Unix權限中,「0644」通常是一個*八進制*值。如果您使用十進制值(100644或644)進行測試,則不會看到您期望的結果。 – 2014-10-28 18:48:20

+0

例如一個稍微修改過的代碼版本,用'perm'的八進制輸出的'%o',按預期工作:https://ideone.com/IAFmLG – 2014-10-28 18:52:44

回答

3

首先,UNIX文件權限通常以八進制表示,對應的格式字符串是「%o」,而不是「%d」。 rw-r - r--確實是0644,但以C語言0644 == 420爲例(後者爲十進制)。

其次,使用的位數多於代碼中指定的9。你實際上應該說類似於

printf(" (%3o)", perms&0777); 
1

請注意,在按位檢查(那些你打印R,W和X),你只打印權限,您有興趣 當你使用%d打印的權限。 ,您將打印所有權限。嘗試檢查S_IFREG也。你會看到它在一開始就會導致'意外'100。在權限字段中,該位設置爲存儲這是一個「常規」文件。

相關問題