Unix上的C ++:重定向Shell输出

时间:2012-01-31 12:00:32

标签: c++ shell system

我有一个编译 test.cpp 的命令,应该将输出存储在输出文件中。以下是我生成的cmd的示例:

  

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

当我使用 system()时,它不起作用。即使它创建输出文件,它仍然会将所有内容打印到主控制台窗口。当我在终端中执行它时,它工作得很好。

我也尝试过使用 popen() fgets()(只是从here复制代码),但同样的事情发生了。我可能只是分叉我的进程并使用 freopen 或其他东西,但我有套接字和多个线程在后台运行。我猜他们也会重复,这不好。

任何想法可能会失败?

2 个答案:

答案 0 :(得分:3)

根据system的man-page,它调用sh这是标准的bourne shell(不是bash,Bourne Again SHell)。并且bourne shell不理解&>。所以你可能需要使用旧样式:

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

答案 1 :(得分:0)

我在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

如果我在shell中键入foo &> bar,我会看到的是什么。