Me temo que tu comprensión es completamente al revés. :)
Piense en "entrada estándar", "salida estándar" y "error estándar" desde la perspectiva del programa , no desde la perspectiva del núcleo.
Cuando un programa necesita imprimir resultados, normalmente se imprime en "salida estándar". Un programa generalmente imprime la salida a la salida estándar printf
, que imprime SOLAMENTE a la salida estándar.
Cuando un programa necesita imprimir información de error (no necesariamente excepciones, se trata de una construcción de lenguaje de programación, impuesta en un nivel mucho más alto), normalmente se imprime en "error estándar". Normalmente lo hace con fprintf
, que acepta una secuencia de archivos para usar al imprimir. La secuencia de archivos podría ser cualquier archivo abierto para escritura: salida estándar, error estándar o cualquier otro archivo que se haya abierto con fopen
o fdopen
.
"estándar en" se usa cuando el archivo necesita leer la entrada, usando fread
o fgets
, o getchar
.
Cualquiera de estos archivos se puede redirigir fácilmente desde el shell, así:
cat /etc/passwd > /tmp/out # redirect cat's standard out to /tmp/foo
cat /nonexistant 2> /tmp/err # redirect cat's standard error to /tmp/error
cat < /etc/passwd # redirect cat's standard input to /etc/passwd
O, toda la enchilada:
cat < /etc/passwd > /tmp/out 2> /tmp/err
Hay dos advertencias importantes: Primero, "entrada estándar", "salida estándar" y "error estándar" son solo una convención. Son una convención muy fuerte , pero todo es solo un acuerdo de que es muy bueno poder ejecutar programas como este: grep echo /etc/services | awk '{print $2;}' | sort
y tener las salidas estándar de cada programa conectadas a la entrada estándar del siguiente programa en la tubería.
En segundo lugar, he dado las funciones estándar ISO C para trabajar con secuencias de archivos ( FILE *
objetos): en el nivel del núcleo, son todos los descriptores de archivos ( int
referencias a la tabla de archivos) y muchas operaciones de nivel inferior como read
y write
, que no hacer el búfer feliz de las funciones de ISO C. Pensé en hacerlo simple y usar las funciones más fáciles, pero de todos modos pensé que deberías conocer las alternativas. :)