Вопрос
статтест.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 (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
Решение
Попробуйте распечатать st_rdev
Участник.На странице руководства написано:
struct stat {
dev_t st_dev; /* device inode resides on */
[ ... snip ... ]
dev_t st_rdev; /* device type, for special file inode */
};
Я думаю, вы печатаете не то же поле, к которому обращается форматировщик %r.Вас интересует не устройство, на котором находится файл device, а устройство, которое этот файл описывает.
Цифры, по крайней мере, согласуются с вашими ls
выходной сигнал;major=14 и minor = 0, и вы печатаете 234881024, что в шестнадцатеричном формате равно 0xE000000.0xE - это, конечно, 14 знаков после запятой.Это указывает на то, что Mac OS X хранит основное число в верхних 8 битах, а второстепенное число в нижних 24.Это, в свою очередь, подразумевает, что dev_t
тип 32-разрядный, что позволяет печатать его как long long
немного сомнительно.