2009-10-29 50 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