Le diable est dans les détails... Pour commencer, il y a le principe fondamental du design Unix :tout est un fichier , Bien expliqué ici.
La seconde est que l'appel stat(2) vous donne inode statistiques stockées sur le système de fichiers concernant le fichier spécial de l'appareil qui a une taille de zéro (pensez-y comme lstat(2)
). Si vous avez un périphérique bloc qui contient un système de fichiers, vous obtenez des informations à son sujet en utilisant statfs(2)
ou getfsstat(2)
ou statvfs(2)
d'une manière indépendante du système de fichiers/périphérique.
La gestion des fichiers spéciaux (résidant généralement dans /dev) a toujours été spécifique au système et les pages de manuel se trouvent dans la section 4. Donc, si vous voulez manipuler un périphérique directement, vous devriez lire les détails là-bas. Par exemple, sous Linux man 4 hd
vous montrera comment interagir par programmation avec les périphériques de bloc IDE. Alors que man 4 sd
vous expliquera comment interagir avec les disques scsi, etc.
Troisième chose, les appels système ne sont pas censés être incohérents dans leur fonctionnalité NOR leurs limites.
J'espère que cela a aidé.
à partir de cette question Unix Stack Exchange :
Les fichiers de périphérique ne sont pas des fichiers en soi. Il s'agit d'une interface d'E/S pour utiliser les périphériques dans les systèmes d'exploitation de type Unix. Ils n'utilisent pas d'espace sur le disque, cependant, ils utilisent toujours un inode comme indiqué par la commande stat :
$ stat /dev/sda
File: /dev/sda
Size: 0 Blocks: 0 IO Block: 4096 block special file
Device: 6h/6d Inode: 14628 Links: 1 Device type: 8,0
Cela résout le stat
partie.
le fait que l'on puisse chercher dans ce "fichier" n'est pas lié. Ce n'est pas vraiment un fichier, mais vous pouvez open
et lisez-le. Vous pouvez aussi le rechercher. Il permet de lire le disque au niveau le plus bas, donc une recherche est nécessaire (c'est pour ça que ça marche, et pourquoi ne retournerait-il pas la nouvelle position comme n'importe quel "vrai" fichier ?).
Selon cette autre réponse UnixSE, vous pouvez obtenir la taille de l'appareil en lisant ce /dev/sda/size
fichier.
La longueur d'un "périphérique" tel que /dev/sda
n'est pas spécifié par le POSIX struct stat
:
off_t st_size For regular files, the file size in bytes.
For symbolic links, the length in bytes of the
pathname contained in the symbolic link.
For a shared memory object, the length in bytes.
For a typed memory object, the length in bytes.
For other file types, the use of this field is
unspecified.
POSIX n'a donc aucune exigence pour la "taille" d'un périphérique de disque.
Linux ne précise pas non plus que stat()
doit renvoyer la taille d'un périphérique de disque :
st_size
Ce champ donne la taille du fichier (s'il s'agit d'un fichier normal ou d'un lien symbolique) en octets. La taille d'un lien symbolique correspond à la longueur du nom de chemin qu'il contient, sans octet nul de fin.