2009-10-29 49 views
1

stattest.c:stat()如何工作?

// compile: gcc -o stattest stattest.c 
#include <stdio.h> 
#include <sys/stat.h> 

int main(int argc, char *argv[]) { 
    struct stat stats; 
    stat(argv[1], &stats); 
    printf("%lli\n", (long long)stats.st_dev); 
    return 0; 
} 

用法:

 
stat -f "%r" /dev/disk0 
=> 234881024     (Value that I'm looking for.) 

./teststat /dev/disk0 
=> 44921876 

python -c 'import os,sys; print os.stat(sys.argv[1]).st_dev' /dev/disk0 
=> 44921876 

爲什麼沒有我的代碼給我stat命令給我的價值?

更新1

提取44921876主號碼給了我2這是/dev/tty

更新2

指定文件系統上的工作文件。 (我只使用python在這裏,因爲它的速度更快。)

 
python -c "import sys,os; print os.stat(sys.argv[1]).st_dev" /path/to/file 
=> 234881024 
+0

請增加「ls -ld/dev/disk0」的輸出,如果你不在Mac OS X上,這會有幫助。 – unwind 2009-10-29 10:32:23

+0

'brw-r ----- 1個根操作符14,0 19 Okt 16 :59/dev/disk0' – 2009-10-29 10:35:23

回答

4

嘗試打印st_rdev成員。手冊頁說:

struct stat { 
    dev_t st_dev; /* device inode resides on */ 
    [ ... snip ... ] 
    dev_t st_rdev; /* device type, for special file inode */ 
}; 

我想你不打印%r格式化程序訪問的同一個字段。您對設備文件所在的設備不感興趣,但對該文件描述的設備不感興趣。

這些數字至少與您的ls輸出一致; major = 14和minor = 0,並且您打印234881024,它在十六進制中是0xE000000。 0xE當然是14位十進制數。這表示Mac OS X將主號碼存儲在前8位中,次號碼存儲在前24位中。這反過來意味着dev_t類型是32位,這使得您將其打印爲long long有點可疑。

+0

'long long'只有在'dev_t'切換到64位時纔會出現。 – 2009-10-29 11:04:02

+0

非常感謝!完美的作品。 – 2009-10-29 11:11:00