如果我们通过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
而不是stdout
。 popen
捕获stdout
但不重定向stderr
。
如果Windows上的系统提供标准的posix外壳程序,可以通过添加重定向2>&1
来将stderr
重定向到您提供给popen
的命令行中的stderr
stdout
。