【问题标题】:Getting the output from a process created by CreateProcess从由 CreateProcess 创建的进程中获取输出
【发布时间】:2017-04-28 15:15:03
【问题描述】:

在我的控制台应用程序中,我使用 CreateProcess 方法创建了一个进程。 现在,这个进程要么写入控制台“OK”要么“Not OK”。我怎样才能截获这些信息,以便在控制台中将其写入文件?

【问题讨论】:

  • 再次阅读CreateProcess的文档,注意STARTUPINFO结构体
  • 重新打开了这个问题,因为提议的副本处理获取输出的一般情况,而这个问题是关于一个甚至不需要输出的特殊情况,并且提议的副本的答案会是矫枉过正,太复杂了。

标签: c++ winapi


【解决方案1】:
  • 使用CreatePipe 创建匿名管道。
  • 将孩子的标准输出设置为管道的写入端
  • 父进程从管道的读取端读取
  • 父进程可以写入文件和控制台,以及任何位置。

有关详细信息,请参阅 MSDN 上的 Creating a Child Process with Redirected Input and Output

【讨论】:

    【解决方案2】:

    管道很难正确处理,尤其是在 Windows 中。当您有简单的单行输出时,就像在这种情况下,只需将进程的标准输出重定向到一个临时文件并读取它。一种非常简单的重定向方法是让cmd.exe 通过其> 运算符完成这项工作。


    听起来好像您正在开发已启动的流程。

    如果是这种情况,请考虑使用进程退出代码而不是输出,以获得是/否结果。

    进程退出代码是来自main 的结果值。 (通常相同的)值 0EXIT_SUCCESS 表示成功,例如“OK”,而值 EXIT_FAILURE,加上在 Windows 中来自 <windows.h> 的值 E_FAIL,表示失败,例如“Not OK ”。在 Windows 中,EXIT_SUCCESS(来自 <stdlib.h> 标头)始终为 0,EXIT_FAILURE 通常为 1。

    检查进程退出代码比检查进程的输出更简单、更有效。

    特别是,C++ 标准库的system 函数返回进程退出代码,并将您的命令传递给cmd.exe,因此无需为这种情况做API 级的舞蹈。

    【讨论】:

    • 请注意,为了使其工作,您必须通过cmd.exe /c 显式启动该进程。 CreateProcess API 不直接支持标准输出重定向。
    • @CodyGray:不是“明确地”,因为system 为您完成了这项工作。但除此之外,是的。感谢您指出这一点(不确定是否需要在答案中,ATM 我将其视为类似脚注的细节)。
    • 好吧,system 会做到的。但我不会用枪指着我的头来使用它。这个问题确实明确提到了 CreateProcess。
    • 我还没有阅读有关它的答案。 system 允许您假装您正在编写“标准”平台无关代码,但实际上并非如此。实际上,您可以在命令行上执行的命令在所有操作系统上都是相同的。因此,如果您无论如何都在编写依赖于平台的代码,那么您不妨使用平台 API。这些让您可以更好地控制行为,允许您做一些不错的事情,例如重定向输入,而无需诉诸传统 DOS 语法及其所有限制。
    • 如果CreateProcess 太难用,那么我可以看到system 的吸引力。对于玩具程序,这是有道理的。但是,如果我想通过管道输出来自外部进程的输出,我确信我想直接启动该进程,而不是将 cmd.exe 放在两者之间,并且正如 Cody 所说,必须处理 cmd 命令解析器的变幻莫测。更没有实际意义,让 cmd 来完成这项工作只会让我感到懒惰和肮脏。
    猜你喜欢
    • 1970-01-01
    • 2012-03-14
    • 1970-01-01
    • 2013-02-07
    • 1970-01-01
    • 2017-06-19
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多