Как работает функция stat ()?

#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-битный.