Question

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

Utilisation:

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

Pourquoi mon code ne me donne-t-il pas la valeur que la commande stat me donne?

Mise à jour 1

En extrayant le nombre majeur de 44921876, on obtient 2 qui est / dev / tty .

Mise à jour 2

Spécifier un fichier sur le système de fichiers fonctionne. (J'utilise seulement python ici parce que c'est plus rapide.)

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

La solution

Essayez d’imprimer le membre st_rdev . La page de manuel dit:

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

Je pense que vous n'imprimez pas le même champ que le formateur% r. Le fichier sur lequel se trouve le fichier de périphérique ne vous intéresse pas, mais le périphérique décrit par le fichier.

Les nombres sont au moins cohérents avec votre sortie ls ; majeur = 14 et mineur = 0 et vous imprimez 234881024, qui correspond à 0xE000000 en hexadécimal. 0xE est bien sûr 14 décimal. Cela indique que Mac OS X stocke le numéro majeur dans les 8 bits supérieurs et le numéro mineur dans le 24 inférieur. Cela implique à son tour que le type dev_t est 32 bits, ce qui rend l'impression comme long long un peu douteux.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top