C运行外部程序并获得结果

时间:2010-11-19 00:39:31

标签: c

在C中,我应该如何执行外部程序并获得其在控制台中运行的结果?

如果有一个名为dummy的可执行文件,并且在执行时它在命令提示符下显示4位数字,我想知道如何运行该可执行文件并获取它生成的4位数字。在C.

4 个答案:

答案 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库调用会调用forkpipe来完成其工作。使用它,你只能简单地读取进程转储到stdout的任何东西(你可以使用底层shell来重定向)。使用较低级别的函数,您几乎可以执行任何操作,包括读取stderr和编写标准输入。

在Windows上,查看CreatePipe()CreateProcess()等调用,并将STARTUPINFO的IO成员设置为您的管道。您可以使用read()使用进程句柄获取文件描述符_open_ofshandle()。根据应用程序的不同,您可能需要阅读多线程,或者可以阻止。