读取字符串中的gcc输出

时间:2015-03-24 03:27:48

标签: c windows redirect gcc stdout

如果我们执行gcc通过system()函数编译源文件,我该如何捕获字符串中的gcc输出?


我尝试使用popen只要它读取类似"PAUSE"的内容就可以使用,但是在运行新的子进程时无法使用gcc。

2 个答案:

答案 0 :(得分:1)

有很多方法。

简单方法: 将输出重定向到临时文件并将临时文件读入字符串。

您可以使用管道。在子进程中,将输出重定向到管道,并从管道的另一端读取到字符串。 见man pipe

//In the parent process
int fd[2]
pipes(fd);

//Use fork+execv instead of system to launch child process.
if (fork()==0) {
    //Redirect output to fd[0]
   dup2(fileno(fd[0]), STDOUT_FILENO);
   dup2(fileno(fd[0]), STDERR_FILENO);
   //Use execv function to load gcc with arguments.

} else {
  //read from the other end fd[1]
}

请参阅http://ubuntuforums.org/archive/index.php/t-1627614.html处的帖子。

另见In C how do you redirect stdin/stdout/stderr to files when making an execvp() or similar call?

对于Windows,此链接可能对您有所帮助。 https://msdn.microsoft.com/en-us/library/windows/desktop/ms682499%28v=vs.85%29.aspx 流程几乎与Linux相同。语法和原语可能不同。在这里,想法是使用管道和重定向过程输出文件到您的管道文件。

答案 1 :(得分:0)

如果您尝试阅读gcc生成的错误消息,则需要记住它们已发送到stderr,而不是stdoutpopen捕获stdout但不重定向stderr

如果Windows上的system提供了标准的posix shell,您可以通过添加重定向{{},在stderr的命令行中将stdout重定向到popen。 1}}。