GNU/Linux >> Tutoriales Linux >  >> Linux

¿Por qué stat::st_size es 0 para dispositivos pero al mismo tiempo lseek define correctamente el tamaño del dispositivo?

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.


Linux
  1. ¿Qué define el tamaño máximo para un solo argumento de comando?

  2. ¿Por qué es tan importante "nodev" en /etc/fstab? ¿Cómo se utilizan los dispositivos de caracteres para piratear?

  3. ¿Cómo copiar un archivo y crear los directorios de destino al mismo tiempo?

  4. ¿Por qué la siguiente manera no cambia el tamaño límite del archivo principal?

  5. ¿Qué software de compresión de archivos para Linux ofrece la mayor reducción de tamaño?

¿Cómo calcula el comando stat los bloques de un archivo?

¿Por qué difieren los hashes md5 de dos tarballs del mismo archivo?

No queda espacio en el dispositivo, pero la partición solo está llena hasta la mitad y los inodos están disponibles

Obtener el valor numérico de chmod para un archivo

¿Por qué los enlaces duros parecen ocupar el mismo espacio que los originales?

Linux:¿Cómo usar un archivo como entrada y salida al mismo tiempo?