Saltar al contenido

¿Cómo cerrar stdout y stderr en C?

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 o stderr (que son FILE* punteros (ver su definición) y luego escribiendo a estos mientras FILE* 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ó.

¡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 *