1

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

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

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

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

问题是写入文件会在某个时候停止。有时它会冻结,在某个地方缓冲,而不是它的一部分被一次又一次地扔掉。大多数时候它只是停止。

我验证了二进制文件继续运行并写入标准输出。

4

2 回答 2

1

您可以通过使用popen()来避免大部分情况。每次popen调用都会为您的主程序设置一个单独的管道来读取,并且输出不会交织在一起,因为它会将所有内容都定向到标准输出。显然也比写入和拖尾文件要简单得多。这是否比fork/exec您的目的更好,只有您可以说。

于 2013-07-01T16:37:18.537 回答
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.

于 2013-07-01T16:24:02.090 回答