我的程序使用“system”命令以下列方式启动两个二进制文件:
int status = system("binaryOne &");
int status = system("binaryTwo &");
由于所有三个二进制文件都写入相同的标准输出,因此所有输出都是混合的,不可理解。所以我更改了启动命令,将两个二进制文件的stdout重定向到我做尾巴的不同文件-f:
int status = system("binaryOne > oneOut.txt &");
int status = system("binaryTwo > twoOut.txt &");
问题是写入文件会在某些时候停止。有时它冻结,缓冲某处,而不是一次又一次地抛出。大部分时间它都会停止。
我验证了二进制文件继续运行并写入stdout。
答案 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
,您可以说。