2016-02-13 55 views
0

我是一個初學者的Unix編程和C和我有關於struct stat及其外地st_mode兩個問題:C/Unix:如何從st_mode中提取位?

  1. 當訪問下面的st_mode場,返回什麼類型號(八進制,十進制等等)?

    struct stat file; 
    stat(someFilePath, &file); 
    printf("%d", file.st_mode); 
    

我認爲數字是八進制,但是當我跑這個代碼,我得到了價值33188。基地是什麼?

  1. 我發現st_mode編碼了一個16位二進制數,代表文件類型和文件權限。如何從上述輸出中獲取16位數字(特別是當它看起來不是八進制數時)。 16位數字的哪些部分對哪些信息進行編碼?

感謝您的幫助。

回答

4

我認爲你在這裏混合概念。

在內存中,整數值總是二進制的,我們稱之爲本機格式st_modemode_t類型,該類型是未指定的整數類型,可能是int

的概念,即十進制,八進制或十六進制,只有當你在機格式隱蔽數在存儲器中的文本表示,(或從文本返回到天然的)是有用的。

例如:

int x = 42; 

分配編號42爲整數變量。由於源代碼是文本,所以42作爲文本輸入,我們知道它是一個十進制值(無前綴)。但請注意我們如何不指定變量的基礎:它沒有一個。 其他代碼:

int x = 0x2A; 

完全等同。它使用十六進制常數0x2A而不是十進制常量42,但它是相同的,並且x在兩種情況下都獲得相同的值。同樣地:

int x = 052; 

也是等效的,但是具有八進制常數。

現在到你的代碼。當你這樣做時:

printf("%d", file.st_mode); 
33188 

你告訴程序輸出該變量的值作爲十進制數。請記住,printf將數字從本機格式轉換爲文本,因此該文本的基礎很重要。如果你喜歡看的價值爲八進制,只寫:

printf("%o", file.st_mode); 
100644 

或者十六進制:

printf("%x", file.st_mode); 
81A4 

約八進制的好處是,itrepresents每八進制數字恰好3位(每個數字4位對於十六進制),所以通過一些練習,你可以看到沒有計算的位。

例如,您的st_mode是十進制的33188或十進制的0100644。小數點並不表示什麼,因爲我記得最後9位(3個八進制數字)是權限:所有者3位,組3位,其他3位。所以:

* Owner: 6 that is rw- 
* Group: 4 that is r-- 
* Other: 4 that is r-- 

BTW,最後1是本恆:

#define S_IFREG 0100000 

,僅表示這是一個普通文件。

0
  1. 該數字是一個值。在printf()中,您可以使用"%d"以十進制形式(如您所做的那樣)打印它,或使用"%o"(或"%lo")代替以八進制形式打印。

  2. 檢查man 2 stat關於如何表示每個信息。然後,您可以使用位掩碼來提取所需的信息。有一個例子在手冊頁中展示了它。

0

你打印它爲十進制,所以你得到十進制。如果你將它打印成八進制,你會得到八進制;同上。

當打印爲八進制時,st_mode字段最容易理解。

printf("mode = %07o\n", file.st_mode); 

最後三位是熟悉的權限(644,例如)用於chmod等從右邊的第四位通常是0,但將是非零的用於設置UID,設置GID或粘位文件或目錄。其餘數字標識文件的類型。

您可以使用<sys/stat.h>的宏來剖析信息。