GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi stat::st_size vaut 0 pour les appareils alors qu'en même temps lseek définit correctement la taille de l'appareil ?

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.


Linux
  1. Pourquoi « nodev » dans /etc/fstab est-il si important ? Comment utiliser les périphériques de caractères pour le piratage ?

  2. Comment copier un fichier et créer les répertoires cibles en même temps ?

  3. Sortie vers Stdout et en même temps Grep dans un fichier ?

  4. Pourquoi le volume LVM chiffré (périphérique luks) ne se monte-t-il pas au démarrage ?

  5. Pourquoi "zip" dans une boucle For fonctionne-t-il lorsque le fichier existe, mais pas lorsqu'il n'existe pas ?

Quel logiciel de compression de fichiers pour Linux offre la plus grande réduction de taille ? ?

Pourquoi Ls -l n'affiche-t-il pas l'heure et/ou l'année pour chaque fichier ? ?

Pourquoi Ls et Hexdump ne sont-ils pas d'accord sur la taille du fichier ?

Modifier la taille maximale de téléchargement de fichiers pour PhpMyAdmin dans Plesk

Pourquoi les liens durs semblent-ils occuper le même espace que les originaux ?

Linux :Comment utiliser un fichier en entrée et en sortie en même temps ?