C, C++: Fechar a saída padrão e de erro (stdout, stderr)

Uma forma de impedir que seu programa imprima na tela, seja por linkar com uma biblioteca que abusa da verbosidade ou para garantir que um daemon não polua seu terminal quando for para background, é fechando a saída padrão (stdout) e a saída de erro (stderr), como mostrado no exemplo seguinte:

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main(void)
{
        int fd = open("/dev/null", O_WRONLY);

        close(1); // stdout
        close(2); // stderr
        dup(fd);  // Duplica o descritor fd que corresponde a /dev/null
        dup(fd);  // usando o menor numero disponivel, no caso, 1 e 2

        printf("No verbosity anymore!\n"); // Nao imprime nada na tela
        return 0;
}

Apenas fechar as saídas não é o bastante, senão um printf ou um cout (C++), que por padrão escrevem em stdout, iriam escrever em um descritor inválido. Direcionar a saída para o /dev/null é uma boa opção, já que ele descarta tudo que é escrito nele. Vale observar que a implementação mostrada nesta dica não é thread-safe.

This entry was posted in C, CPP and tagged , , , , , . Bookmark the permalink.

4 Responses to C, C++: Fechar a saída padrão e de erro (stdout, stderr)

  1. Ademar Reis says:

    Falando em daemon, é bom lembrar que pra executar um programa em background o ideal é usar a função daemon(3), que além de redirecionar as saídas e a entrada pra /dev/null, desconecta o programa do terminal atual.

  2. Anonymous says:

    Pode-se usar a função dup2 também:

    int fd = open(“/dev/null”, O_RDWR);

    dup2(fd, STDOUT_FILENO);
    dup2(fd, STDERR_FILENO);
    dup2(fd, STDIN_FILENO);

  3. Valentim says:

    Bom dia,
    Estou com um problema, tenho um programa em C que ao executar um outro programa pela linha de comandos queria redireccionar o output para um ficheiro contudo ele imprime sempre para a consola.
    Alguma forma de fazer isto?

  4. Bruno says:

    Opa Valentim essa eu sei… =-)

    De uma olhada na system call posix_spawn(3) ela executa um programa, tipo o exec, mas vc pode usar seus parametros 3 e 4 para informar algumas coisas que necessita, como por exemplo na estrutura posix_spawn_file_actions_t pode dizer que quer redirecionar o stdout dele para um arquivo (err |= posix_spawn_file_actions_addopen(&actions, (int)STDOUT_FILENO, destination, O_RDWR | O_CREAT, 755);). Eh um pouco grandinho a utilizaçao destas funçoes mas da para se fazer muita coisa com elas. =)

    OU

    fazer system(“ls > meuArquivo”); Tambem resolve system por baixo dos panos usa /bin/sh ai ele faz tudo isso e mais um pouco para vc ta ai 2 formas de fazer isso que precisa, na segunda vc precisa criar seu arquivo ele nao sera criado, na primeira ele cria com a opçao O_CREAT.

    Abraços.

Comments are closed.