将stdout重定向到文件在中间停止。 Linux的

时间:2013-07-01 16:06:06

标签: c linux ubuntu

我的程序使用“system”命令以下列方式启动两个二进制文件:

int status = system("binaryOne &");
int status = system("binaryTwo &");

由于所有三个二进制文件都写入相同的标准输出,因此所有输出都是混合的,不可理解。所以我更改了启动命令,将两个二进制文件的stdout重定向到我做尾巴的不同文件-f:

int status = system("binaryOne > oneOut.txt &");
int status = system("binaryTwo > twoOut.txt &");

问题是写入文件会在某些时候停止。有时它冻结,缓冲某处,而不是一次又一次地抛出。大部分时间它都会停止。

我验证了二进制文件继续运行并写入stdout。

2 个答案:

答案 0 :(得分:1)

以下是使用fork + exec

进行试用的方法
pid_t child_pid = fork();

if (!child_pid) {
    // child goes here

    char * args[] = {"binaryOne", NULL};

    int fd = open("oneOut.txt", O_WRONLY | O_CREAT | O_TRUNC);

    if (!fd) {
        perror("open");
        exit(-1);
    }

    // map fd onto stdout
    dup2(fd, 1);

    // keep in mind that the children will retain the parent's stdin and stderr
    // this will fix those too:
    /*
    fd = open("/dev/null", O_RDWR);
    if (!fd) {
        perror("open");
        exit(-1);
    }

    // disable stdin
    dup2(fd, 0);
    // disable stderr
    dup2(fd, 2);
    */

    execvp(*args, args);

    // will only return if exec fails for whatever reason
    // for instance file not found

    perror("exec");

    exit(-1);
}

// parent process continues here

if(child_pid == -1) {
    perror("fork");
}

编辑重要提示:忘记为open设置写入标记。

答案 1 :(得分:1)

您可以使用popen()来避免大部分问题。每个popen调用将为您的主程序设置一个单独的管道,并且输出不会交织在一起,因为它将所有内容都指向了stdout。显然,写入和拖尾文件也不那么笨拙。对于您的目的,这是否优于fork/exec,您可以说。