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.