Pregunta

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 qué mi código no me da el valor que me da el comando stat ?

Actualización 1

Extraer el número principal de 44921876 me da 2, que es / dev / tty .

Actualización 2

Especificar un archivo en el sistema de archivos funciona. (Solo estoy usando Python aquí porque es más rápido).

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

Solución

Intente imprimir el miembro st_rdev . La página del manual dice:

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

Creo que no está imprimiendo el mismo campo al que accede el formateador% r. No le interesa el dispositivo en el que se encuentra el archivo del dispositivo, sino el dispositivo que describe el archivo.

Los números son al menos consistentes con su salida ls ; mayor = 14 y menor = 0, e imprime 234881024, que en hexadecimal es 0xE000000. 0xE es, por supuesto, 14 decimales. Esto indica que Mac OS X almacena el número principal en los 8 bits superiores y el número menor en los 24 inferiores. Esto, a su vez, implica que el tipo dev_t es de 32 bits, lo que hace que su impresión como long long un poco dudoso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top