读取string中的gcc输出

如果我们通过system()函数执行gcc来编译一个源文件,我怎样才能捕获一个string中的gcc输出?


我用popen试过,只要它读取"PAUSE" ,但不能用gcc工作,因为它运行一个新的subprocess。

有很多方法。

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

你可以使用管道。 在子进程中,将输出重定向到管道,并从管道的另一端读取到字符串。 看到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上的主题 。

另请参阅在C中进行execvp()或类似的调用时,如何将stdin / stdout / stderr重定向到文件?

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

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

如果Windows上的系统提供标准的posix外壳程序,可以通过添加重定向2>&1来将stderr重定向到您提供给popen的命令行中的stderr stdout