C stat()是如何工作的?

C stat()是如何工作的?,c,darwin,stat,C,Darwin,Stat,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); retur

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;
}

尝试打印
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
输出一致;主=14,次=0,打印234881024,十六进制为0xE000000。当然,0xE是14位小数。这表示Mac OS X将主要数字存储在前8位,将次要数字存储在下24位。这反过来意味着
dev\u t
类型是32位的,这使得将其打印为
long
有点可疑。

尝试打印
st\u rdev
成员。手册页上说:

struct stat {
   dev_t    st_dev;    /* device inode resides on */
   [ ... snip ... ]
   dev_t    st_rdev;   /* device type, for special file inode */
};
我认为您打印的字段与%r格式化程序访问的字段不同。您对设备文件所在的设备不感兴趣,但对文件描述的设备感兴趣


这些数字至少与您的
ls
输出一致;主=14,次=0,打印234881024,十六进制为0xE000000。当然,0xE是14位小数。这表示Mac OS X将主要数字存储在前8位,将次要数字存储在下24位。这反过来又意味着
dev\u t
类型是32位的,这使得您将其打印为
long
有点可疑。

请添加“ls-ld/dev/disk0”的输出,如果您不在Mac OS X上,这会很有帮助。
brw-r-----1根操作符14,0 19 Okt 16:59/dev/disk0
请添加“ls-ld/dev/disk0”的输出如果你不在Mac OS X上,这也很有帮助。
brw-r-----1根操作符14,0 19 Okt 16:59/dev/disk0
只有在case
devu t
切换到64位时,
long-long
才在case
devu t
切换到64位时存在。
struct stat {
   dev_t    st_dev;    /* device inode resides on */
   [ ... snip ... ]
   dev_t    st_rdev;   /* device type, for special file inode */
};