Saltar al contenido

¿Qué tan portátiles son /dev/stdin, /dev/stdout y /dev/stderr?

Te damos la respuesta a este asunto, al menos eso pensamos. Si tienes interrogantes dínoslo y sin dudarlo te responderemos

Solución:

Ha estado disponible en Linux desde su prehistoria. Está no POSIX, aunque muchos proyectiles reales (incluido AT&T ksh y bash) lo simulará si no está presente en el sistema operativo; tenga en cuenta que esta simulación solo funciona a nivel de shell (es decir, redirección o parámetro de línea de comando, no como argumento explícito para, por ejemplo, open()). Dicho esto, debería estar disponible en la mayoría sistemas Unix comerciales, de una forma u otra (a veces se escribe /dev/fd/N para varios enteros Npero la mayoría de los sistemas con eso proporcionarán enlaces simbólicos como lo hacen Linux y *BSD).

la /dev/stdin,out,err los archivos son normalmente solo enlaces simbólicos a /proc/self/fd/0,1,2 (respectivamente). Como tal, no se gana nada con el uso de métodos definidos por POSIX.

Si desea cumplir con POSIX, la mejor manera de hacerlo es usar la redirección de salida. La redirección de salida de Shell se define en el estándar POSIX. Además, los números de descriptor de archivo STDIN, STDOUT, STDERR también forman parte de POSIX.
En resumen, cosas como >&2 están garantizados para trabajar.

Sin embargo, una cosa importante a tener en cuenta es que el uso de STDIN, STDOUT y STDERR depende de cómo se inició el programa. Si el programa se inició con el descriptor de archivo 1 siendo un identificador abierto para un archivo, entonces su programa solo tiene que aceptarlo. Incluso si tuviera que abrir el programa /dev/stdouttodo lo que haría es abrir el descriptor de archivo 1 que aún apuntará a ese archivo.
Si esto es lo que está tratando de evitar, debe abrir el TTY directamente. Normalmente, sin ninguna redirección, STDIN, STDOUT y STDERR son solo descriptores de archivos abiertos que apuntan al mismo TTY. No hay absolutamente nada más que eso.

POSIX 7 dice que son extensiones.

Definiciones básicas, requisitos de la sección 2.1.1:

El sistema puede proporcionar extensiones no estándar. Estas son funciones que POSIX.1-2008 no exige y pueden incluir, entre otras:

[…]

  • Archivos especiales de caracteres adicionales con propiedades especiales (por ejemplo,/dev/stdin, /dev/stdout y/dev/stderr)

Encontrado al hacer grepping en el HTML de POSIX: ¿Dónde está la lista de funciones de la API de POSIX C?

También extrañamente, el uuencode herramienta da/dev/stdoutun efecto mágico:

Especificando un decode_pathname operando de /dev/stdout

indicará que uudecode debe usar salida estándar.

La documentación del kernel de Linux dice que todos los sistemas deberían tenerlo.

https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/devices.rst

Compulsory links
These links should exist on all systems:
/dev/fd       /proc/self/fd   symbolic   File descriptors
/dev/stdin    fd/0            symbolic   stdin file descriptor
/dev/stdout   fd/1            symbolic   stdout file descriptor
/dev/stderr   fd/2            symbolic   stderr file descriptor

Sin embargo, no pude encontrar dónde se crean esos enlaces simbólicos en el kernel (¿se proporciona la distribución?).

Sección de Reseñas y Valoraciones

Si crees que ha sido de utilidad este post, sería de mucha ayuda si lo compartes con otros juniors y nos ayudes a extender nuestra información.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *