【问题标题】:Extracting dos command output in C在C中提取dos命令输出
【发布时间】:2012-05-17 04:34:29
【问题描述】:

使用system()exec(),我可以执行任何命令,但它们会将结果显示到控制台中。我想执行命令并提取输出并处理它,然后显示它。如何在 Windows/DOS 平台上实现这一点?

【问题讨论】:

标签: c system exec dos


【解决方案1】:

在标准 C 中没有类似的东西,但通常,为了与 POSIX 兼容,编译器实现popen(VC++ 中为_popen),它启动一个命令(就像它对system 所做的那样)并返回一个@ 987654327@ 到您请求的流(如果您想读取输出如果您想为程序提供一些输入,您可以请求 stdout)。

获得FILE * 后,您可以使用通常的fread/fscanf/... 来读取它,就像在普通文件上一样。

如果您希望输入和输出重定向都开始变得有点复杂,因为 Windows 编译器通常确实有类似 POSIX pipe 的东西,但它并不完全兼容 (主要是因为 Windows 进程创建模型不同)。

在这种情况下(并且在任何情况下,您需要对启动的进程进行比普通的popen 更多的控制)我会简单地使用“真实”的方式在 Windows 上执行 IO 重定向,即使用 @987654322 @ 和适当的选项;参见例如here.

【讨论】:

  • 很棒的答案。 +1 ....也看看我的答案...它以更简单的方式解决。
  • @ahmedtabrez:谢谢,但我不推荐您的方法,因为它涉及文件 IO(及其所有缺点:权限、已经存在的文件、处理错误......)没必要。
【解决方案2】:

Matteo Italia 的回答很棒。但是有些编译器(尤其是旧的)不支持popen()

如果不支持popen(),这里有一个可能的解决方案。

在 DOS 中,我们可以使用 > 将输出重定向到一个临时文件。

例如:

C:\> ipconfig > temp.txt

然后我可以在我的 C 代码中打开 temp.txt,然后重新处理其内容。

我的 C 代码将类似于:

system("ipconfig > temp.txt");
FILE *fp;
fp = fopen("temp.txt","r");
//                                         //
//... Code for reprocessing can go here ...//
//                                         //

【讨论】:

    【解决方案3】:

    对于那些没有 popen 的人来说,这是一个替代答案,它应该适用于大多数系统。此代码不是线程安全的。我希望这对于大多数情况来说不是一个重大限制。

    #include <stdio.h>
    #include <process.h>
    #include <io.h>
    #include <sys\stat.h>
    #include <assert.h>
    
    int main()
    {
        int so = dup(1);
        close(1);
        int i = creat("output.txt", S_IWRITE);
        assert(i == 1); // i should be 1...
        system("dir");
        close(i);
        dup2(so, 1);
        close(so);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-27
      • 1970-01-01
      相关资源
      最近更新 更多