GNU/Linux >> Tutoriales Linux >  >> Linux

¿Portabilidad de los enlaces de descriptores de archivos?

Siempre me he preguntado esto, pero nunca me tomé el tiempo de averiguarlo, así que lo haré ahora:qué tan portátil es el uso que se muestra aquí de /proc/$$/fd/$N o /dev/fd/$N ? Entiendo que POSIX garantiza /dev/null, /dev/tty y /dev/console (aunque solo lo descubrí el otro día después de leer los comentarios sobre esta respuesta) pero ¿y estos otros?

Por lo que sé, son bastante comunes, pero ¿en qué sistemas puedo no esperas encontrarlos? ¿Por qué no? ¿Es más probable encontrar uno que el otro? ¿Exhibirán siempre atributos similares?

Tiendo a usar estos dispositivos bastante de muchas maneras, y me gustaría saber si hay alguna posibilidad de que me quede corto con solo intentarlo.

Además, las preguntas anteriores deben entenderse como solo lo que pienso Me gustaría saber, pero, dado que obviamente tengo que preguntar en primer lugar, es posible que no sepa lo mejor posible en este sentido y no deben considerarse requisitos estrictos para una respuesta. Sólo dame una pista si puedes, por favor.

Respuesta aceptada:

El /proc/PID /fd/NUM los enlaces simbólicos son casi universales en Linux, pero no existen en ningún otro lugar (excepto en Cygwin, que los emula). /proc/PID /fd/NUM también existen en AIX y Solaris, pero no son enlaces simbólicos. Portable, para obtener información sobre archivos abiertos, instale lsof .

Unicos con /proc/PID /fd

Linux

Bajo Linux, /proc/PID /fd/NUM es un enlace simbólico ligeramente mágico al archivo que el proceso con el ID PID tiene abierto en el descriptor de archivo NUM . Este enlace es mágico porque, por ejemplo, se puede usar para acceder al archivo incluso si se elimina el archivo. El enlace también rastreará el archivo a través de cambios de nombre. /proc/self es un enlace simbólico mágico que apunta a /proc/PID donde PID es el proceso que accede al enlace.

Esta función está presente en prácticamente todos los sistemas Linux. Lo proporciona el controlador para el sistema de archivos proc, que es técnicamente opcional pero se usa para muchas cosas (incluida la creación de ps trabajo — lee desde /proc/PID ) que casi nunca se deja de lado, incluso en los sistemas integrados.

Cygwin

Cygwin emula el /proc/PID de Linux /fd/NUM (para procesos de Cygwin) y /proc/self .

Solaris (desde la versión 2.6), AIX

Hay /proc/PID /fd entradas para cada descriptor de archivo, pero aparecen como del mismo tipo que el archivo abierto, por lo que no brindan información sobre la ruta del archivo. Sin embargo, reportan el mismo stat información como fstat informaría al proceso que tiene el archivo abierto, por lo que es posible determinar en qué sistema de archivos se encuentra el archivo y su número de inodo. Los directorios aparecen como enlaces simbólicos, sin embargo, son enlaces simbólicos mágicos que solo se pueden seguir y readlink devuelve una cadena vacía.

En AIX, los procfiles El comando muestra información sobre los archivos abiertos de un proceso. En Solaris, los pfiles El comando muestra información sobre los archivos abiertos de un proceso. Esto no incluye la ruta al archivo (en Solaris, sí desde Solaris 10, ver más abajo).

Solaris (desde la versión 10)

Además de /proc/PID /fd/NUM , las versiones modernas de Solaris tienen /proc/PID /ruta/NUM que contiene enlaces simbólicos similares a los enlaces simbólicos de Linux en /proc/PID /fd/NUM . Los pfiles El comando muestra información sobre los archivos abiertos de un proceso, incluidas las rutas.

Plan9

/proc/PID /fd es un archivo de texto que contiene un registro (línea) por descriptor de archivo abierto por el proceso. El nombre del archivo no se rastrea allí.

Relacionado:¿Extraer el nombre del archivo de la ruta en el programa awk?

QNX

/proc/PID // código> es un directorio, pero no contiene ninguna información sobre descriptores de archivos.

Unidos con /proc pero sin acceso directo a los descriptores de archivos

(Nota:a veces es posible obtener información sobre los archivos abiertos de un proceso hojeando su imagen de memoria a la que se puede acceder en /proc . No cuento eso como "acceso directo".)

Unicos donde /proc/PID es un archivo

El sistema de archivos proc en sí comenzó en UNIX 8th edition, pero con una estructura diferente, y pasó por el Plan 9 y regresó a algunos unices. Creo que todos los sistemas operativos con un /proc tener una entrada para cada PID, pero en muchos sistemas, es un archivo normal, no un directorio. Los siguientes sistemas tienen un /proc/PID que debe leerse con ioctl :

  • Solaris hasta 2.5
  • OSF/1 ahora conocido como Tru64
  • IRIX (?)
  • SCO (?)

MINIX 3

MINIX 3 tiene un servidor procfs que proporciona varios componentes similares a Linux, incluidos /proc/PID // código> directorios. Sin embargo, no hay /proc/PID /fd .

BSD gratuito

FreeBSD tiene /proc/PID // código> directorios, pero no proporcionan información sobre los descriptores de archivos abiertos. (Sin embargo, hay /proc/PID /archivo que es similar al /proc/PID de Linux /exe , dando acceso al ejecutable a través de un enlace simbólico.)

Procfs de FreeBSD está en desuso.

Unicos sin /proc

  • HP-UX
  • OpenBSD
  • NetBSD
  • Mac OS X

Información del descriptor del archivo a través de otros canales

Fusor

El fusor El comando enumera los procesos que tienen un archivo específico abierto o un archivo abierto en el punto de montaje especificado. Este comando es estándar (disponible en todos los sistemas compatibles con XSI, es decir, POSIX con X/Open System Interface Extension).

No puede pasar de un proceso a nombres de archivo con esta utilidad.

Lsof

Lsof significa "lista de archivos abiertos". Es una herramienta de terceros, disponible (pero normalmente no forma parte de la instalación predeterminada) para la mayoría de las variantes de Unix. La obtención de información sobre archivos abiertos depende mucho del sistema, ya que el análisis anterior podría haberlo hecho sospechar. El mantenedor de lsof ha hecho el trabajo de combinarlo todo en una única interfaz.

Puede leer las preguntas frecuentes para ver qué tipo de dificultades tiene que soportar lsof. En la mayoría de los unices, obtener información sobre los nombres de los archivos abiertos requiere analizar las estructuras de datos del kernel. Citando la pregunta frecuente 3.3 "¿Por qué lsof no informa los nombres completos de las rutas?":

Lsof no puede obtener componentes de nombre de ruta de las cachés de nombres de kernel de los siguientes dialectos:

  • AIX

Solo el kernel de Linux registra los nombres completos de las rutas en las estructuras que mantiene sobre los archivos abiertos; en su lugar, la mayoría de los núcleos convierten los nombres de ruta en dobletes de número de nodo y dispositivo y los usan para referencias de archivos posteriores una vez que se han abierto los archivos.

Si necesita analizar información de lsof la salida, asegúrese de usar -F modo (un campo por línea), preferiblemente el -F0 modo (campos delimitados por nulos). Para obtener información sobre un descriptor de archivo específico de un proceso específico, use -a opción con -p PID y -d NUM , p.ej. lsof -a -p 123 -d 0 -F0n .

/dev/fd/NUM para descriptores de archivos del proceso actual

Muchas variantes de Unix proporcionan una forma de que un proceso acceda a sus archivos abiertos a través de un nombre de archivo:abriendo /dev/fd/NUM es equivalente a llamar a dup(NUM ) . Estos nombres son útiles cuando un programa quiere un nombre de archivo pero desea pasar un archivo ya abierto (por ejemplo, una tubería o un zócalo); por ejemplo, los shells que implementan la sustitución de procesos los usan cuando están disponibles (usando una canalización con nombre temporal donde /dev/fd no está disponible).

Donde /dev/fd existe, también suele haber (¿siempre?) sinónimos (a veces enlaces simbólicos, a veces enlaces duros, a veces archivos mágicos con propiedades equivalentes) /dev/stdin =/dev/fd/0 , /dev/stdout =/dev/fd/1 , /dev/stderr =/dev/fd/2 .

  • Bajo Linux, /dev/fd es un enlace simbólico a /proc/self/fd .
  • En la mayoría de los unices (IRIX, OpenBSD, NetBSD, SCO, Solaris, …), las entradas en /dev/fd son dispositivos de carácter. Por lo general, aparecen ya sea que el descriptor de archivo esté abierto o no, y es posible que las entradas no estén disponibles para los descriptores de archivo por encima de un número determinado.
  • Bajo FreeBSD y OSX, el sistema de archivos fdescfs proporciona un /dev/fd dinámico directorio que sigue a los descriptores abiertos del proceso de llamada. Un /dev/fd estático está disponible si /dev/fd no está montado.
  • Bajo OSF/1 (Tru64), /dev/fd se proporciona a través de fdfs.
  • No hay /dev/fd en AIX o HP-UX.
Relacionado:¿Es posible obtener un carácter en el cursor del terminal usando códigos de escape ANSI?
Linux
  1. Gestión de trabajos cron duplicados al ejecutar scripts

  2. ¿Qué son los enlaces blandos y los enlaces duros en el sistema de archivos de Linux?

  3. Recuperar nombre de archivo del descriptor de archivo en C

  4. ¿Cómo funcionan los límites del descriptor de archivos de Linux?

  5. ¿Qué es un archivo .pid y qué contiene?

Comando Ln en Linux (Crear enlaces simbólicos)

¿La diferencia entre enlaces simbólicos y duros?

Echo To File Descriptor sobrescribe el archivo?

¿Qué son los enlaces simbólicos en Linux? ¿Cómo crear enlaces simbólicos?

¿Cómo puedo convertir un puntero de archivo ( FILE* fp ) en un descriptor de archivo (int fd)?

PID máximo en Linux