c++ system(): как заставить молчать
Как заставить молчать system()
? Что бы он не выводил ничего в терминал. А можно ли перенаправить вывод в файл, использую fstream
, а не stdio.h
?
Источник: Stack Overflow на русском
Как заставить молчать system()
? Что бы он не выводил ничего в терминал. А можно ли перенаправить вывод в файл, использую fstream
, а не stdio.h
?
Например, сформировать команду с перенаправлением вывода в /dev/null, в *nix
cmd параметры 1&>2 /dev/null
Update
Если хотите (проверял в только Linux) действительно аккуратно перенаправить вывод в своей программе перед system, а потом вернуться к первоначальному, то придется написать что-то в таком духе:
#ifdef __cplusplus
#include <iostream>
using namespace std;
#endif
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
#include <unistd.h>
int hide_fileno (FILE *f, const char *dst)
{
fflush(f);
int fd,
efd = fileno(f),
save = dup(efd),
olderr = errno;
if (dup2(fd = open(dst, O_WRONLY | O_CREAT | O_TRUNC, 0664), efd) == -1) {
olderr = errno;
close(save);
save = -1;
}
close(fd);
errno = olderr;
return save;
}
int rest_fileno (FILE *f, int savefd)
{
int drc = dup2(savefd, fileno(f));
if (drc != -1)
close(savefd);
return drc;
}
int
main (int ac, char *av[])
{
#ifdef __cplusplus
cout << "Goooo ";
cerr << "main: " << strerror(errno) << '\n';
#else
printf("goo... ");
perror("main");
#endif
int saveout = hide_fileno(stdout, "/dev/null"),
saveerr = hide_fileno(stderr, "/dev/null");
int rc = system("grep xaxa c1.c /");
rest_fileno(stdout, saveout);
rest_fileno(stderr, saveerr);
#ifdef __cplusplus
cerr << "system: " << strerror(errno) << '\n';
cout << "rc = " << rc << '\n';
#else
perror("system");
printf("rc = %d\n", rc);
#endif
}
Дело тут в том, что предложенный в комментарии к ответу @Pavel Mayorov freopen() -- это "путь в один конец".
Еще вариант - закрыть stdin, stdout и stderr.
Если надо выводить туда что-то самому - предварительно клонировать файловые дескрипторы.