1

stattest.c:

// 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(我正在寻找的值。)

./teststat /dev/disk0
=> 44921876

python -c '导入操作系统,系统;打印 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
4

1 回答 1

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有点可疑。

于 2009-10-29T10:47:20.007 回答