El descriptor de archivo 2 está abierto para lectura y escritura.

El descriptor de archivo 2 está abierto para lectura y escritura.

Este es mi programa c leído desde stderr que escribo

#include <uninstd.h>
#include <stdio.h>

int main(void) {
 char buff[3];
 read(2, buff, sizeof(buff));
 printf("%s", buff");
 return 0;
}

Mi pregunta: ¿cómo puedo enviarle un stderr? La mayoría de las búsquedas se muestran como en la redirección de bash

command 2> file

Pero esto envía el stderr a un archivo.

¿Cómo puedo pasar a mi programa? como pepita,

command 2 "somthing here" ./myprogram

Gracias por las respuestas.

Respuesta1

A mucha gente le sorprende, dado que la mayoría de los libros de referencia y la documentación siempre se refieren al error estándar como resultado, que de hecho suele serya abierto para lectura+escritura. Tu programa muchopoderleer del descriptor de archivo 2.

(Nota: en esta respuesta estoy usando los números de descriptor de archivo reales.corrientes Ctales como stderrno necesitan corresponder realmente con estos descriptores de archivos, ya que un programa puede cambiarlos, y agrega una capa de confusión al hablar sobre lo que hacen las secuencias C. Su programa está usando read().)

El descriptor de archivo 2 está abierto para lectura y escritura.

Para programas en sesiones de inicio de sesión donde no se ha utilizado ninguna redirección en un proceso principal, el descriptor de archivo 2 (error estándar) suele ser un duplicado del descriptor de archivo 0 (entrada estándar). Ambos hacen referencia al mismo subyacente.Descripción del archivo, que suele ser el terminal de la sesión de inicio de sesión (abierto y duplicado ttymono, en sistemas más antiguos, gettyal inicio de la sesión).

Si lee desde el descriptor de archivo 2, obtiene la misma entrada que si hubiera leído desde el descriptor de archivo 0.

Por cierto: la lectura del descriptor de archivo 2 se realizaba con frecuencia para cosas como la entrada de contraseña; antes de que se introdujera el /dev/ttydispositivo, alrededor de 1977. La razón para leer el descriptor de archivo 2 era obtener información del terminal original cuando el descriptor de archivo 0 había sido redirigido a otro lugar (como es el caso en medio de una tubería, por ejemplo).

Aunque /dev/ttyha estado disponible desde hace mucho tiempo, más de 40 años, POSIX todavía requiere que el descriptor de archivo 2 también esté abierto para lectura.

Lo que tu programa no está haciendo

Leer desde la salida del descriptor de archivo 2 de otro programa es algo diferente. No puedes hacer eso fácilmentepor sí mismo, sin fusionar la salida estándar con el error estándar. Por lo general, implica una serie de 3>&1 1>&2 2>&3intercambios o similares. Algunos shells permiten canalizaciones en el descriptor 2 del archivo de salida llamando

prog1 2| prog2

Pero tales conchas son raras, y eso no es lo quesunecesidades del programa en cualquier caso.

Enviando información a su programa

Si desea que su programa, leyendo desde el descriptor de archivo 2, lea desde algootroque desde la terminal, por supuesto redirige ese descriptor de archivo. Túpodríausa lo normalaportesintaxis de redirección (el <operador en el shell), pero las bibliotecas de su programa, o incluso otro código que haya escrito en otro lugar, asumirán que pueden escribir en este descriptor de archivo.

El shell le permite utilizar el <>operador de redirección que abre explícitamente un archivo tanto para lectura como para escritura. Esto es lo que usa al redirigir el descriptor de archivo 2 de su programa.

./myprogram 2<>filename

Sin la redirección de shell, existen muchas herramientas que permiten la manipulación de descriptores de archivos. Por ejemplo: con la carga en cadena de Laurent Bercotredirfdherramienta, que viene con execline, esta redirección se parece más a su hipótesis:

redirfd -u 2 filename ./myprogram

También hay una sintaxis de shell como los shells Bourne Again y Z (pero no los shells Almquist) para proporcionar "documentos aquí" y "cadenas aquí" al descriptor de archivo 2. Tenga en cuenta que el descriptor de archivo 2 está abierto.solo lecturapor estos proyectiles en este caso.

./myprogram 2<<< "here string"

Respuesta2

stderrestá destinado a escribir, no a leer. A veces es una dupcomplicación stdin(por ejemplo, cuando las 3 entradas/salidas/err están conectadas al terminal). Para leer stderr de otro programa, redirige el stderr de ese programa al stdin de otro.

por ejemplo, to dirige stdouta un archivo y stderrto ./myprograms's stdin.

command 2>&1 >a_file | ./myprogram

Respuesta3

Con shells como bashy zsh(pero no POSIX simple sh), puede redirigir el error estándar de un programa a la entrada estándar de otro programa a través de firstprogram 2> >(second program).

Ejemplo:

$ perl -E 'say "perl stdout"; warn "perl stderr\n"' 2> >(awk '{print "awk", $0}')
perl stdout
awk perl stderr

Respuesta4

Para que el shell configure una redirección de entrada para stderr, usaría <, <<o <<<y prefijaría el número del descriptor del archivo:

./myprog 2< somefile.txt

o

./myprog 2<<< "some text"

Aunque si redireccionas stderrasí, el programa no podráproduccióna él, lo que significará que no verá ningún mensaje de error que el programa (o cualquier biblioteca que utilice) pueda intentar imprimir y, además, el programa obtendrá errores al intentar escribir esos mensajes.

Es posible que desee reconsiderar si habría alguna otra forma de hacer lo que esté haciendo. Como mínimo, considere usar, por ejemplo, fd 3 si la idea es proporcionar alguna entrada al programa.

información relacionada