Los siete tipos de archivos estándar de Unix son regular , directorio , enlace simbólico , FIFO especial , bloque especial , carácter especial y socket , según lo define POSIX . [1] Las diferentes implementaciones específicas del sistema operativo permiten más tipos de los que requiere POSIX (por ejemplo, puertas Solaris ). El tipo de archivo se puede identificar mediante el ls -l
comando, que muestra el tipo en el primer carácter del campo de permisos del sistema de archivos .
Para archivos normales , Unix no impone ni proporciona ninguna estructura de archivos interna; por lo tanto, su estructura e interpretación depende completamente del software que los utiliza. [2] Sin embargo, el filecomando generalmente se puede utilizar para determinar qué tipo de datos contienen. [3]
En la estructura de estadísticas , el tipo de archivo y los permisos (el modo ) se almacenan juntos en un st_mode
campo de bits , que tiene un tamaño de al menos 12 bits (3 bits para especificar el tipo entre los siete posibles tipos de archivos; 9 bits para permisos). . POSIX define el diseño de los permisos como mínimo de 9 bits, pero el resto no está definido. [1]
Por convención, la moda es un valor de 16 bits escrito como un número octal de seis dígitos sin un cero a la izquierda. La parte del formato ocupa los primeros 4 bits (2 dígitos octales) y "010" ( 1000 en binario) normalmente representa un archivo normal. Los siguientes 3 bits (1 dígito) generalmente se usan para setuid, setgid y sticky . La última parte ya está definida por POSIX para contener el permiso. Un ejemplo es "100644" para un archivo típico. Este formato se puede ver en git , tar y ar , entre otros lugares. [4]
El tipo de archivo se puede probar usando macros como S_ISDIR
. Esta verificación generalmente se realiza enmascarando el modo con S_IFMT
(a menudo el número octal "170000" para la convención de 4 bits principales) y verificando si el resultado coincide S_IFDIR
. S_IFMT
no es un concepto central de POSIX, sino una extensión X/Open System Interfaces (XSI); Los sistemas que se ajustan únicamente a POSIX pueden utilizar otros métodos. [1]
Tomemos, por ejemplo, una línea en la ls -l
salida:
drwxr-xr-x 2 raíz raíz 0 1 de enero de 1970 inicio
POSIX especifica [5] el formato de salida para el formato largo ( -l
opción). En particular, el primer campo (antes del primer espacio) se denomina "cadena de modo de archivo", aquí drwxr-xr-x
. Su primer carácter describe el tipo de archivo, aquí d
(directorio). El resto de esta cadena indica los permisos del archivo .
La versión GNU coreutilsls
utiliza una llamada a filemode()
, una función glibc (expuesta en la biblioteca gnulib [6] ) para obtener la cadena de modo.
FreeBSD utiliza un enfoque más simple pero permite una cantidad menor de tipos de archivos. [7]
El archivo especial más común es el directorio. El diseño de un archivo de directorio está definido por el sistema de archivos utilizado. Como hay varios sistemas de archivos disponibles en Unix, tanto nativos como no nativos, no existe un diseño de archivos de directorio único.
Un directorio está marcado con a d
como primera letra en el campo modo en la salida de ls -dl
[5] o stat
, por ejemplo
$ ls -dl / d rwxr-xr-x 26 raíz raíz 4096 22 de septiembre 09:29 /$ estadística / Archivo: "/" Tamaño: 4096 Bloques: 8 IO Bloque: 4096 directorioDispositivo: 802h/2050d Inodo: 128 Enlaces: 26Acceso: (0755/ d rwxr-xr-x) Uid: ( 0/ raíz) Gid: ( 0/ raíz)...
Un enlace simbólico es una referencia a otro archivo. Este archivo especial se almacena como una representación textual de la ruta del archivo al que se hace referencia (lo que significa que el destino puede ser una ruta relativa o puede no existir en absoluto).
Un enlace simbólico está marcado con l
(minúscula L
) como primera letra de la cadena de modo, por ejemplo, en esta ls -l
salida abreviada: [5]
l rwxrwxrwx ... termcap -> /usr/share/misc/termcap l rwxrwxrwx ... S03xinetd -> ../init.d/xinetd
Uno de los puntos fuertes de Unix siempre ha sido la comunicación entre procesos . Entre las facilidades que brinda el SO se encuentran las tuberías , que conectan la salida de un proceso con la entrada de otro. Esto está bien si ambos procesos existen en el mismo espacio de proceso principal, iniciado por el mismo usuario, pero hay circunstancias en las que los procesos que se comunican deben usar FIFO, aquí denominados canalizaciones con nombre . Una de esas circunstancias ocurre cuando los procesos deben ejecutarse con diferentes nombres de usuario y permisos.
Las canalizaciones con nombre son archivos especiales que pueden existir en cualquier parte del sistema de archivos. Se pueden crear con el comando mkfifo
como en mkfifo mypipe
.
Una canalización con nombre está marcada con a p
como primera letra de la cadena de modo, por ejemplo, en esta ls -l
salida abreviada: [5]
p rw-rw---- ... mipipa
Un socket es un archivo especial utilizado para la comunicación entre procesos , que permite la comunicación entre dos procesos. Además de enviar datos, los procesos pueden enviar descriptores de archivos a través de una conexión de socket de dominio Unix utilizando las llamadas al sistema sendmsg()
y recvmsg()
.
A diferencia de las canalizaciones con nombre que sólo permiten el flujo de datos unidireccional, los sockets son totalmente compatibles con dúplex .
Un socket está marcado con una s
como primera letra de la cadena de modo, por ejemplo
s rwxrwxrwx /tmp/.X11-unix/X0
En Unix, casi todas las cosas se manejan como archivos y tienen una ubicación en el sistema de archivos, incluso los dispositivos de hardware como los discos duros. La gran excepción son los dispositivos de red, que no aparecen en el sistema de archivos sino que se manejan por separado.
Los archivos de dispositivo se utilizan para aplicar derechos de acceso a los dispositivos y para dirigir operaciones en los archivos a los controladores de dispositivo apropiados.
Unix hace una distinción entre dispositivos de caracteres y dispositivos de bloques. La distinción es aproximadamente la siguiente:
Aunque, por ejemplo, las particiones de disco pueden tener dispositivos de caracteres que brindan acceso aleatorio sin búfer a los bloques de la partición y dispositivos de bloque que brindan acceso aleatorio con búfer a los bloques de la partición.
Un dispositivo de caracteres se marca con a c
como primera letra de la cadena de modo y un dispositivo de bloque se marca con a b
, por ejemplo, en esta ls -l
salida abreviada: [5]
c rw-rw-rw- ... /dev/null b rw-rw---- ... /dev/sda
Un archivo no es más que un flujo de bytes...