Closed movaldivia closed 5 years ago
Hola. TL;DR No hay nada malo. Es "casi" lo mismo.
En Linux cada vez que se escribe algo, esto se debe hacer en un destino (un archivo, una posición de memoria, un dispositivo de I/O). Por defecto hay un destino estándar que se conoce como stdout
(salida estándar) y es la manera de referirse a "la pantalla". Cada vez que haces printf("...")
es equivalente a ejecutar fprintf(stdout, "...")
. Así mismo existe un dispositivo de entrada por defecto que es stdin
(entrada estándar) y es la manera de referirse a "el teclado".
Sin embargo, una cosa son los mensajes que el programa imprime debido a su ejecución normal, y otra son los mensajes que ocurren debido a un error, excepción, warning, segmentation fault, o información que genera el programa, pero que no está relacionada con su flujo normal de ejecución. Este destino se conoce como stderr
(standard error) y se refiere al recipiente de los mensajes de error. Ahora bien, este destino por defecto es el mismo que stdout
, o sea la pantalla. Por eso, al escribir mensajes en stdout
o en stderr
, saldrán todos en la pantalla. Pareciera entonces que son lo mismo y que el requisito del enunciado no tiene sentido (casi).
Sin embargo es posible redirigir cada uno de estas impresiones a destinos separados. Esta respuesta muestra varios ejemplos.
Por ejemplo, si tu programa crfs.c
dice esto:
printf("Mensaje a stdout\n");
fprintf(stderr, "Mensaje a stderr\n");
Si ejecutas ./crfs simdisk.bin
, la salida en pantalla será
Mensaje a stdout
Mensaje a stderr
que es lo esperado. Sin embargo si ejecutas ./crfs simdisk.bin 2> file-err.txt
, entonces la salida en pantalla dirá
Mensaje a stdout
mientras que el archivo file-err.txt
contendrá la línea
Mensaje a stderr
De la misma manera, si ejecutas: ./crfs simdisk.bin > file-out.txt
, la salida en pantalla será
Mensaje a stderr
y el archivo file-out.txt
contendrá
Mensaje a stdout
En ocasiones, cuando un programa imprime muchas líneas en pantalla, más de las que una terminal normal alcanza a mostrar (o implica hacer mucho scroll para revisarlo) puede ser más conveniente redirigir las líneas de stdout
a un archivo. De esta manera, después de la ejecución (el programa debe terminar porque solamente entonces se cierra el archivo) puedes abrir el archivo en un editor y analizarlo completamente. Al momento de hacer esta redirección, no se mostrará nada en la pantalla, salvo los mensajes que vayan a stderr
.
Separar los mensajes que son "de error" y los mensajes "normales" en destinos distintos, aunque por defecto ambos sean a la pantalla, permite posteriormente separarlos y poder aislar únicamente los mensajes que advierten anormalidades de aquellos que representan una ejecución normal.
Espero que esto te ayude.
@cruz Muchas profesor, excelente explicación!!
Hola respecto al uso de stderr en bitmap, no le entiendo mucho el sentido. Por lo menos, en mi caso, es lo mismo que simplemente imprimir en pantalla. Estaré haceindo algo mal?