#c #darwin #stat
Вопрос:
статтест.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], amp;stats);
printf("%llin", (long long)stats.st_dev);
return 0;
}
Использование:
статистика -f "%r" /dev/disk0 => 234881024 (Значение, которое я ищу.) ./teststat /dev/disk0 => 44921876 python -c 'импорт ОС,sys; печать os.stat(sys.argv[1]).st_dev' /dev/disk0 => 44921876
Почему мой код не дает мне значения stat
, которое дает мне команда?
Обновление 1
Извлечение большого числа 44921876 дает мне 2, что и есть /dev/tty
.
Обновление 2
Указание файла в файловой системе работает. (Я использую python здесь только потому, что он быстрее.)
python -c "импорт sys,ОС; печать os.stat(sys.argv[1]).st_dev" /путь/к/файлу => 234881024
Комментарии:
1. Пожалуйста, добавьте также вывод «ls-ld /dev/disk0», это полезно, если вы не используете Mac OS X.
2.
brw-r----- 1 root operator 14, 0 19 Okt 16:59 /dev/disk0
Ответ №1:
Попробуйте распечатать 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_t
тип 32-разрядный, что делает вашу печать long long
немного сомнительной.
Комментарии:
1. Он
long long
есть только в том случаеdev_t
, если переключится на 64-битный.