Si encuentras algún detalle que no entiendes nos puedes dejar un comentario y te responderemos rápidamente.
Solución:
Tu puedes sólo:
fclose(stdout);
fclose(stderr);
Para cualquiera que se pregunte por qué querría hacer esto, esta es una tarea bastante común para un proceso de daemon/servicio en Unix.
Sin embargo debe tener en cuenta que cerrar un descriptor de archivo puede tener consecuencias no deseadas:
- Cuando abra archivos nuevos, se utilizarán estos descriptores ahora gratuitos. Así, por ejemplo, si posteriormente
fopen
ese descriptor de archivo (al menos en Linux) reemplazará a fd 1, es decir, stdout. Cualquier código que utilice posteriormente esto se escribirá en este archivo, lo que puede no ser lo que pretendía. - Ver los comentarios de R.. sobre los descriptores de archivo frente a la biblioteca C
FILE*
punteros Específicamente:- Si escribe en un fd cerrado en Linux, obtendrá un error, pero:
- Si usa una función de biblioteca C que usa
stdout
ostderr
(que sonFILE*
punteros (ver su definición) y luego escribiendo a estos mientrasFILE*
está cerrado es un comportamiento indefinido. Es probable que esto bloquee su programa de formas inesperadas, no siempre en el punto del error. Ver comportamiento indefinido.
- Su código no es la única parte afectada. Las bibliotecas que utilice y los procesos que inicie que hayan heredado estos descriptores de archivo como sus descriptores estándar también se verán afectados.
La solución rápida y sencilla es freopen()
Decir /dev/null
, /dev/console
bajo Linux/OSX o nul
en Windows Como alternativa, puede usar la implementación específica de su plataforma para volver a abrir los descriptores/identificadores de archivos según sea necesario.
¿Qué has probado? No fclose
¿trabajar?
Si desea evitar que su aplicación escriba en la consola, entonces:
#include
int main()
fprintf(stdout, "stdout: msg1n");
fprintf(stderr, "stderr: msg1n");
fclose(stdout);
fprintf(stdout, "stdout: msg2n"); // Please read the note setion below
fprintf(stderr, "stderr: msg2n");
fclose(stderr);
fprintf(stdout, "stdout: msg3n");
fprintf(stderr, "stderr: msg3n");
Salidas:
stdout: msg1
stderr: msg1
stderr: msg2
Nota: cualquier intento de utilizar un puntero de ARCHIVO después de cerrar el archivo es erróneo. Lo estoy haciendo en este caso solo para ilustrar lo que significa cerrar estos descriptores de archivo. puede que hacer con su aplicación.
Comentarios y puntuaciones
Nos encantaría que puedieras mostrar este tutorial si te ayudó.