GNU/Linux >> Linux Esercitazione >  >> Linux

Perché stat::st_size è 0 per i dispositivi ma allo stesso tempo lseek definisce correttamente la dimensione del dispositivo?

Il diavolo è nei dettagli... Tanto per cominciare, c'è il principio fondamentale della progettazione Unix:tutto è un file , Ben spiegato qui.

Il secondo è che la chiamata stat(2) ti dà inode statistiche memorizzate nel filesystem relative al file device-special che ha una dimensione pari a zero (pensalo come lstat(2) ). Se hai un dispositivo a blocchi che ha un filesystem su di esso ottieni informazioni su di esso usando statfs(2) o getfsstat(2) o statvfs(2) in modo indipendente dal filesystem/dispositivo.

La gestione di file speciali (di solito residenti in /dev) è sempre stata specifica del sistema e le pagine di manuale risiedono nella sezione 4. Quindi, se si desidera manipolare direttamente un dispositivo, è necessario leggere le specifiche lì. Ad esempio, in Linux man 4 hd ti mostrerà come interagire a livello di codice con i dispositivi a blocchi IDE. Mentre man 4 sd ti spiegherà come interagire con i dischi scsi, ecc.

Terza cosa, le chiamate di sistema non dovrebbero essere incoerenti nella loro funzionalità NOR i loro limiti.

Spero che questo ti sia stato d'aiuto.


da questa domanda di Unix Stack Exchange:

I file del dispositivo non sono file di per sé. Sono un'interfaccia I/O per utilizzare i dispositivi in ​​sistemi operativi simili a Unix. Non usano spazio su disco, tuttavia usano ancora un inode come riportato dal comando 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

Questo risolve il stat parte.

il fatto che tu possa cercare in questo "file" non è correlato. Questo non è realmente un file, ma puoi open e leggere da esso. Puoi cercarlo anche tu. Permette di leggere il disco al livello più basso, quindi la ricerca è necessaria (ecco perché funziona, e perché non restituirebbe la nuova posizione come qualsiasi file "reale"?).

Secondo quest'altra risposta UnixSE, puoi ottenere la dimensione del dispositivo leggendo questo /dev/sda/size file.


La lunghezza di un "dispositivo" come /dev/sda non è specificato dal 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. 

Quindi POSIX non ha requisiti per la "dimensione" di un dispositivo disco.

Allo stesso modo, Linux non specifica che stat() restituirà la dimensione di un dispositivo disco:

st_size

Questo campo fornisce la dimensione del file (se è un file regolare o un collegamento simbolico) in byte. La dimensione di un collegamento simbolico è la lunghezza del percorso che contiene, senza un byte nullo di terminazione.


Linux
  1. Perché il modo seguente non cambia la dimensione del limite del file principale?

  2. Quale software di compressione file per Linux offre la massima riduzione delle dimensioni?

  3. Perché il volume Lvm crittografato (dispositivo luks) non si monta all'avvio?

  4. Perché `zip` in un ciclo For funziona quando il file esiste, ma non quando non lo è?

  5. Perché il documento Parent Shell Here non funziona per il sottocomando in Dash ma Bash funziona?

Come copiare un file e creare le directory di destinazione allo stesso tempo?

Output su Stdout e allo stesso tempo Grep in un file?

Perché Ls -l non mostra l'ora e l'anno per ogni file??

Ottieni il tempo di esecuzione del programma nella shell

Perché gli hash md5 di due tarball dello stesso file differiscono?

Perché gli hard link sembrano occupare lo stesso spazio degli originali?