C stat()是如何工作的?
stattest.c: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
// 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
只有在casedevu t
切换到64位时,long-long
才在casedevu t
切换到64位时存在。
struct stat {
dev_t st_dev; /* device inode resides on */
[ ... snip ... ]
dev_t st_rdev; /* device type, for special file inode */
};