Si hago lo siguiente:
touch /tmp/test
y luego realizar
ls -la /tmp/
Pude ver el test
archivo con 0 Bytes en el directorio.
Pero, ¿cómo maneja el sistema operativo un concepto de 0 bytes ? Si lo pongo en términos simples:
0 Bytes no es memoria en absoluto, por lo tanto, no se crea nada.
La creación de un archivo, debe o debe al menos requerir cierta memoria, ¿verdad?
linux
files
filesystems
Shan-Desai
fuente
fuente
Respuestas:
Un archivo es (aproximadamente) tres cosas separadas:
Cuando crea un archivo vacío, crea solo el inodo y una entrada de directorio que apunta a ese inodo. Lo mismo para archivos dispersos (
dd if=/dev/null of=sparse_file bs=10M seek=1
).Cuando crea enlaces duros a un archivo existente, simplemente crea entradas de directorio adicionales que apuntan al mismo inodo.
He simplificado las cosas aquí, pero entiendes la idea.
fuente
touch
creará un inodo y /ls -i
ostat
mostrará información sobre el inodo:Observe que
test
usa 0 bloques. Para almacenar los datos mostrados, el inodo usa algunos bytes. Esos bytes se almacenan en la tabla de inodo. Mire la página ext2 para ver un ejemplo de una estructura de inodo .fuente
ls
(o bueno, lastat(2)
llamada al sistema) le indica el tamaño del contenido del archivo. La cantidad de espacio que necesita el sistema de archivos para la contabilidad no es parte de eso, y como detalle de implementación, no es algo que a los programas en general les deba importar o incluso saber. Hacer visibles los detalles de implementación haría que la abstracción del sistema de archivos fuera menos útil.fuente
El archivo, en sí mismo, no ocupa ningún espacio, pero el sistema de archivos sí lo hace, almacenando el nombre de archivo, la ubicación, los derechos de acceso y similares.
fuente
Respuesta simple: porque se define de esa manera.
Respuesta más larga: se define de esa manera porque algunas operaciones son conceptualmente más simples:
Puede hacer más cosas: * Los archivos de registro de errores tienden a crearse vacíos, para llenarse solo si ocurre un error. * Para saber cuántos errores ocurrieron, cuente el número de líneas en los archivos de registro. Si el archivo de registro está vacío, el número de errores es cero, lo que tiene mucho sentido. * A veces ve archivos donde todo el texto relevante está en el nombre del archivo, por ejemplo
this-is-the-logging-directory
. Esto evita que los administradores ansiosos eliminen directorios vacíos después de la instalación, y también evita errores en los que un programa o un usuario crean accidentalmente un archivo donde el programa desea ver un directorio más tarde. Elgit
programa (y otros) tienden a ignorar los directorios vacíos, y si un proyecto / administrador / usuario quiere tener un registro de que el directorio existe aunque no tenga contenido útil (todavía), puede ver un archivo vacío llamadoempty
oempty.directory
.Ninguna operación se vuelve más complicada:
En el caso de los archivos, el aspecto "hay un archivo grabado en alguna parte" (inodo y / o nombre del archivo) se suma a las consideraciones anteriores, pero los sistemas de archivos no harían eso si los archivos vacíos fueran inútiles.
En general, todas las razones anteriores, excepto las relacionadas con los nombres de archivo, se aplican a las secuencias. Lo más notable para las cadenas, que son secuencias de caracteres: las cadenas de longitud cero son comunes dentro de los programas. Las cadenas generalmente no se permiten a nivel de usuario si no tienen sentido: un nombre de archivo es una cadena, y la mayoría de los sistemas de archivos no permiten una cadena vacía como nombre de archivo; internamente, al crear nombres de archivo a partir de fragmentos, el programa puede tener una cadena vacía como uno de los fragmentos.
fuente
Usando la analogía más simple:
Comparemos un archivo con, digamos, un vaso de agua.
'touch / tmp / test' es muy parecido a crear un vaso vacío, sin agua. El vaso está vacío, por lo que su tamaño es cero. Pero el vidrio existe.
En el lenguaje del sistema de archivos, el vidrio son los metadatos, mientras que el contenido del vidrio son los datos. Los metadatos contienen todo tipo de cosas como se menciona en las publicaciones anteriores.
Los archivos de tamaño cero pueden ser útiles. Un ejemplo es usarlos como una ruta de exploración, donde su mera existencia se puede usar para indicar algún tipo de estado (es decir, si el archivo existe: entonces haga algo; si no: ignore).
fuente
Piénselo de esta manera: digamos que un programa está rastreando consultas SQL enviadas a su servidor. El programa quiere indicar que está registrando solicitudes en un archivo de texto sin formato, pero aún no se han registrado solicitudes. ¿Cómo debería ser eso? Yo diría que debería ser un archivo de tamaño cero en
/var/log/acme-sql-server/queries.log
. De esa manera, podría averiguar cuándo comenzó el registro (el tiempo de creación del archivo), cuándo se actualizó por última vez (es decir, cuándo se creó), cuántas consultas se registraron (número de nuevas líneas en el archivo = 0) y quién está haciendo el registro (Acme SQL Server). Para casos como este, es útil tener el concepto de un archivo vacío que, sin embargo, existe en una ubicación particular.fuente