El diablo está en los detalles... Para empezar, existe el principio fundamental del diseño de Unix:todo es un archivo , Muy bien explicado aquí.
La segunda es que la llamada stat(2) te está dando inode estadísticas almacenadas en el sistema de archivos sobre el archivo especial del dispositivo que tiene un tamaño de cero (piense en ello como lstat(2)
). Si tiene un dispositivo de bloque que tiene un sistema de archivos, obtiene información sobre él usando statfs(2)
o getfsstat(2)
o statvfs(2)
de forma independiente del sistema de archivos/dispositivo.
Tratar con archivos especiales (que generalmente residen en /dev) siempre ha sido específico del sistema y las páginas del manual residen en la sección 4. Por lo tanto, si desea manipular un dispositivo directamente, debe leer los detalles allí. Por ejemplo, en Linux man 4 hd
le mostrará cómo interactuar mediante programación con dispositivos de bloque IDE. Mientras que man 4 sd
le dará cómo interactuar con discos scsi, etc.
En tercer lugar, no se supone que las llamadas al sistema sean inconsistentes en su funcionalidad NOR sus limitaciones.
Espero que esto haya ayudado.
de esta pregunta de Unix Stack Exchange:
Los archivos de dispositivo no son archivos per se. Son una interfaz de E/S para usar los dispositivos en sistemas operativos similares a Unix. No usan espacio en el disco, sin embargo, todavía usan un inodo como lo informa el 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
Eso resuelve el stat
parte.
el hecho de que pueda buscar en este "archivo" no está relacionado. Esto no es realmente un archivo, pero puede open
y leer de él. También puedes buscarlo. Permite leer el disco en el nivel más bajo, por lo que es necesario buscar (por eso funciona, y ¿por qué no devolvería la nueva posición como cualquier archivo "real"?).
De acuerdo con esta otra respuesta de UnixSE, puede obtener el tamaño del dispositivo leyendo este /dev/sda/size
archivo.
La longitud de un "dispositivo" como /dev/sda
no está especificado por 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.
Por lo tanto, POSIX no tiene requisitos para el "tamaño" de un dispositivo de disco.
Linux tampoco especifica que stat()
devolverá el tamaño de un dispositivo de disco:
st_size
Este campo da el tamaño del archivo (si es un archivo regular o un enlace simbólico) en bytes. El tamaño de un enlace simbólico es la longitud del nombre de ruta que contiene, sin un byte nulo de terminación.