Los siete tipos de archivos estándar de Unix son regular , directory , symbolical link , FIFO special , block special , character special y socket según lo definido por POSIX . [1] Diferentes implementaciones específicas de SO permiten más tipos de los que requiere POSIX (por ejemplo, Solaris doors ). El tipo de un 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 los archivos regulares , Unix no impone ni proporciona ninguna estructura de archivo interna; por lo tanto, su estructura e interpretación dependen completamente del software que los utiliza. [2] Sin embargo, el filecomando generalmente se puede usar para determinar qué tipo de datos contienen. [3]
En la estructura stat , 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 tipos de archivos posibles; 9 bits para permisos). El diseño de los permisos está definido por POSIX como al menos 9 bits significativos , pero el resto no está definido. [1]
Por convención, el modo es un valor de 16 bits escrito como un número octal de seis dígitos sin un cero inicial. La parte de formato ocupa los 4 bits iniciales (2 dígitos octales), y "010" ( 1000 en binario) generalmente representa un archivo normal. Los siguientes 3 bits (1 dígito) se usan generalmente 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 un archivo se puede comprobar utilizando macros como S_ISDIR
. Esta comprobación se realiza normalmente enmascarando el modo con S_IFMT
(a menudo el número octal "170000" para la convención de 4 bits iniciales) y comprobando si el resultado coincide con S_IFDIR
. S_IFMT
no es un concepto básico de POSIX, sino una extensión de X/Open System Interfaces (XSI); los sistemas que se ajustan únicamente a POSIX pueden utilizar otros métodos. [1]
Tomemos como ejemplo una línea en la ls -l
salida:
drwxr-xr-x 2 root root 0 1 de enero de 1970 inicio
POSIX especifica [5] el formato de la 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 coreutils de ls
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 menor cantidad de tipos de archivos. [7]
El archivo especial más común es el directorio. La disposición de un archivo de directorio se define según el sistema de archivos utilizado. Como hay varios sistemas de archivos disponibles en Unix, tanto nativos como no nativos, no existe una disposición única de archivos de directorio.
Un directorio se marca con una d
como primera letra en el campo de 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 Bloque IO: 4096 directorioDispositivo: 802h/2050d Inodo: 128 Enlaces: 26Acceso: (0755/ d rwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)...
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 se marca con una l
(minúscula L
) como la 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
Una de las fortalezas de Unix siempre ha sido la comunicación entre procesos . Entre las facilidades que proporciona el sistema operativo 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 padre, iniciado por el mismo usuario, pero hay circunstancias en las que los procesos que se comunican deben utilizar FIFO, aquí denominados tuberías 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 tubería con nombre se marca con una p
como la primera letra de la cadena de modo, por ejemplo en esta ls -l
salida abreviada: [5]
p rw-rw---- ... mipipe
Un socket es un archivo especial que se utiliza para la comunicación entre procesos y 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 mediante las llamadas del sistema sendmsg()
y recvmsg()
.
A diferencia de las tuberías con nombre, que solo permiten un flujo de datos unidireccional, los sockets son totalmente compatibles con dúplex .
Un socket está marcado con una s
como la primera letra de la cadena de modo, por ejemplo
es rwxrwxrwx /tmp/.X11-unix/X0
En Unix, casi todo se maneja como archivos y tiene 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 distingue entre dispositivos de caracteres y dispositivos de bloques. La distinción es, en líneas generales, la siguiente:
Aunque, por ejemplo, las particiones de disco pueden tener dispositivos de caracteres que proporcionan acceso aleatorio sin búfer a los bloques de la partición y dispositivos de bloque que proporcionan acceso aleatorio con búfer a los bloques de la partición.
Un dispositivo de caracteres se marca con un c
como la primera letra de la cadena de modo y un dispositivo de bloque se marca con un b
, por ejemplo en esta ls -l
salida abreviada: [5]
c rw-rw-rw- ... /dev/null b rw-rw---- ... /dev/sda
no es más que un flujo de bytes...