Как работает stat ()? - PullRequest
       11

Как работает stat ()?

1 голос
/ 29 октября 2009

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

Использование:

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

1 Ответ

4 голосов
/ 29 октября 2009

Попробуйте распечатать элемент 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 выводу; major = 14 и minor = 0, и вы печатаете 234881024, что в шестнадцатеричном виде равно 0xE000000. 0xE - это, конечно, 14 десятичных знаков. Это означает, что Mac OS X хранит старший номер в старших 8 битах, а младший номер - в младших 24. Это, в свою очередь, означает, что тип dev_t является 32-битным, что делает его печатью как long long немного сомнительно.

...