c++ system(): как заставить молчать

Рейтинг: 2Ответов: 2Опубликовано: 20.04.2015

Как заставить молчать system()? Что бы он не выводил ничего в терминал. А можно ли перенаправить вывод в файл, использую fstream, а не stdio.h?

Ответы

▲ 4Принят

Например, сформировать команду с перенаправлением вывода в /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() -- это "путь в один конец".

▲ 3

Еще вариант - закрыть stdin, stdout и stderr.

Если надо выводить туда что-то самому - предварительно клонировать файловые дескрипторы.