如果我们执行gcc通过system()
函数编译源文件,我该如何捕获字符串中的gcc输出?
我尝试使用popen
只要它读取类似"PAUSE"
的内容就可以使用,但是在运行新的子进程时无法使用gcc。
答案 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
,而不是stdout
。 popen
捕获stdout
但不重定向stderr
。
如果Windows上的system
提供了标准的posix shell,您可以通过添加重定向{{},在stderr
的命令行中将stdout
重定向到popen
。 1}}。