Pergunta

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

Uso:

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

Por que não o meu código de me dar o valor do comando stat me dá?

Update 1

Extraindo o maior número de 44921876 me dá 2, que é /dev/tty.

Update 2

A especificação de um arquivo sobre as obras do sistema de arquivos. (Eu só estou usando python aqui porque é mais rápido.)

python -c "import sys,os; print os.stat(sys.argv[1]).st_dev" /path/to/file
=> 234881024
Foi útil?

Solução

Tente imprimir o membro st_rdev. A página do manual diz:

struct stat {
   dev_t    st_dev;    /* device inode resides on */
   [ ... snip ... ]
   dev_t    st_rdev;   /* device type, for special file inode */
};

Eu acho que você não está imprimindo o mesmo campo que os acessos formatador% r. Você não está interessado no dispositivo o arquivo de dispositivo estiver ligado, mas o dispositivo que o arquivo descreve.

Os números são pelo menos consistentes com a sua saída ls; major = 14 e minor = 0, e você imprimir 234.881.024, que em hexadecimal é 0xE000000. 0xE é, naturalmente, 14 decimal. Isso indica Mac OS X armazena o número grande no top 8 bits, e o menor número na parte inferior 24. Este, por sua vez, implica que o tipo dev_t é de 32 bits, o que torna o seu imprimi-lo como long long um pouco duvidoso.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top