在C中,我应该如何执行外部程序并获得其在控制台中运行的结果?
如果有一个名为dummy的可执行文件,并且在执行时它在命令提示符下显示4位数字,我想知道如何运行该可执行文件并获取它生成的4位数字。在C.
答案 0 :(得分:4)
您可以在UNIX上使用popen()
。
答案 1 :(得分:4)
这实际上并不是ISO C本身可以做的事情(我的意思是标准本身不提供此功能) - 可能最简单的便携式解决方案是简单地运行程序,将其标准输出重定向到文件,如:
system ("myprog >myprog.out");
然后使用标准ISO C fopen/fread/fclose
将该输出读入变量。
这不一定是最佳解决方案,因为这可能取决于底层环境(甚至重定向输出的能力也是特定于平台的)但我认为我会为了完整性而添加它。 / p>
答案 2 :(得分:4)
popen()很好地处理了这个问题。例如,如果您想要调用某些内容并逐行读取结果:
char buffer[140];
FILE *in;
extern FILE *popen();
if(! (in = popen(somecommand, "r"""))){
exit(1);
}
while(fgets(buff, sizeof(buff), in) != NULL){
//buff is now the output of your command, line by line, do with it what you will
}
pclose(in);
之前这对我有用,希望它有用。确保包含stdio以便使用它。
答案 3 :(得分:3)
如前所述,unix上有popen()
,可让您FILE*
进行阅读。
或者在unix上,您可以使用pipe()
,fork()
,exec()
,select()
和read()
以及wait()
的组合以更一般化/更灵活的方式完成任务。
popen
库调用会调用fork
和pipe
来完成其工作。使用它,你只能简单地读取进程转储到stdout的任何东西(你可以使用底层shell来重定向)。使用较低级别的函数,您几乎可以执行任何操作,包括读取stderr和编写标准输入。
在Windows上,查看CreatePipe()
和CreateProcess()
等调用,并将STARTUPINFO
的IO成员设置为您的管道。您可以使用read()
使用进程句柄获取文件描述符_open_ofshandle()
。根据应用程序的不同,您可能需要阅读多线程,或者可以阻止。