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.
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.
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);
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?
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.