C ++ в Unix: перенаправление вывода оболочки - PullRequest
1 голос
/ 31 января 2012

У меня есть команда, которая компилирует test.cpp и должна сохранять выходные данные в выходном файле.Вот пример моего сгенерированного cmd:

g ++ tmp / test.cpp -o tmp / test &> tmp / compile.out

, когда я использую system () , не работает.Даже если он создает выходной файл, он все равно печатает все в главном окне консоли.Когда я выполняю его в терминале, он работает просто отлично.

Я также пытался использовать popen () и fgets () (просто копируя код из здесь ) но то же самое произошло.Я, вероятно, мог бы просто раскошелиться на мой процесс и использовать freopen или что-то еще, но у меня есть сокеты и несколько потоков, работающих в фоновом режиме.Я думаю, они тоже будут дублироваться, что нехорошо.

Есть идеи, почему это может не получиться?

Ответы [ 2 ]

3 голосов
/ 31 января 2012

Согласно man-странице system, она вызывает sh, которая является стандартной оболочкой bourne (не bash, Bourne Again SHell).И оболочка Борна не понимает &>.Поэтому вам может понадобиться использовать старый стиль:

g++ tmp/test.cpp -o tmp/test >tmp/compile.out 2>&1
0 голосов
/ 31 января 2012

Я попробовал следующий вариант на popen(), и он работал у меня под Mac OS X 10.7.2, gcc 4.2.1:

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>

int main (int argc, char **argv)
{
    FILE *fpipe;
    char *cmd = "foo &> bar";

    if ( !(fpipe = (FILE*)popen(cmd,"r")) ) {
        perror("Problems with pipe");
        return EXIT_FAILURE;
    }

    return EXIT_SUCCESS;
}

Компиляция:

gcc -Wall test.c -o test

Двоичный файл test создает файл с именем bar, который содержит следующий вывод:

sh: foo: command not found

Что бы я увидел, если бы набрал foo &> bar в оболочке.

...