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
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.