2009-10-29 9 views
1

stattest.c:Comment fonctionne stat()?

// 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 me donne la valeur de la commande stat me donne?

Update 1

le nombre important Extraction de 44.921.876 me donne 2 qui est /dev/tty.

Mise à jour 2

Spécifier un fichier sur les travaux du système de fichiers. (Je suis seulement en utilisant python ici parce qu'il est plus rapide.)

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

Veuillez également ajouter la sortie de "ls -ld/dev/disk0", cela est utile si vous n'êtes pas sur Mac OS X. – unwind

+0

'brw-r ----- 1 opérateur racine 14, 0 19 Okt 16 : 59/dev/disk0' –

Répondre

4

imprimezle 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% r formatter accède. Le périphérique sur lequel se trouve le fichier de périphérique, mais le périphérique décrit par le fichier ne vous intéresse pas.

Les chiffres correspondent au moins à votre sortie ls; majeur = 14 et mineur = 0, et vous imprimez 234881024, qui en hexadécimal est 0xE000000. 0xE est, bien sûr, 14 décimal. Cela indique que Mac OS X stocke le numéro majeur dans les 8 premiers bits, et le numéro mineur dans le 24 inférieur. Cela implique que le type dev_t est 32 bits, ce qui rend votre impression de long long un peu douteuse.

+0

Le 'long long' est seulement là au cas où' dev_t' bascule en 64bit. –

+0

Merci beaucoup! Fonctionne parfaitement. –