Domanda

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

Utilizzo:

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

Perché il mio codice non mi dà il valore che mi dà il comando stat ?

Aggiornamento 1

L'estrazione del numero maggiore di 44921876 mi dà 2 che è / dev / tty .

Aggiornamento 2

La specifica di un file sul filesystem funziona. (Sto usando Python solo perché è più veloce.)

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

Soluzione

Prova a stampare il membro st_rdev . La pagina del manuale dice:

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

Penso che non stai stampando lo stesso campo a cui accede il formattatore% r. Non sei interessato al dispositivo su cui si trova il file del dispositivo, ma al dispositivo descritto dal file.

I numeri sono almeno coerenti con il tuo output ls ; major = 14 e minor = 0 e si stampa 234881024, che in esadecimale è 0xE000000. 0xE è, ovviamente, 14 decimale. Ciò indica che Mac OS X memorizza il numero maggiore tra gli 8 bit superiori e il numero minore tra quelli inferiori 24. Questo, a sua volta, implica che il tipo dev_t è a 32 bit, il che rende la stampa come long long un po 'dubbia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top