是否可以在程序运行时获得程序的输出?

Posted

技术标签:

【中文标题】是否可以在程序运行时获得程序的输出?【英文标题】:Is it possible to get the output of a program while it's running? 【发布时间】:2009-11-06 12:18:14 【问题描述】:

如果我有一个用 c++ 编写的 Windows 控制台程序,是否可以在程序运行时检索该程序的标准输出?如果没有,重写程序的最佳方法是什么?我知道我可以输出到文件并不断检查这些文件是否有更新。还有其他方法吗?有没有更好的办法?

【问题讨论】:

检索到哪里?进入另一个程序或日志文件? 另外那个程序也是用c++写的? 很有可能。但是最好使用非语言特定的解决方案。 【参考方案1】:

代码项目中有一些有趣的文章:

CommandLineHelper (C#) Redirecting an arbitrary Console's Input/Output (MFC/C++) Universal Console Redirector (MFC/C++)

【讨论】:

【参考方案2】:

是的,如果您自己启动程序:

在CreateProcess 中,您传递一个STARTUPINFO,您可以在其中指定SDIN、STDOUT 和STDERR 的句柄。请注意,一旦您指定了STARTF_USESTDHANDLES 标志,oyu 需要提供所有三个。

此外,句柄需要是可继承的(否则子进程无法访问它们),因此 SECURITY_ATTRIBUTES 基本上需要至少看起来像这样:

SECURITY_ATTRIBUTES secattr =  sizeof(SECURITY_ATTRIBUTES), NULL, TRUE ;

您可以打开包含输入和接收输出的磁盘文件的句柄。或者,这可以是Pipes,可以在控制台应用程序运行时以增量方式读取/写入。

【讨论】:

【参考方案3】:

如果它是一个准备好的控制台可执行文件 您总是可以将其输出重定向到这样的文件中:

c:> echo 一些文本 > 文件

c:> 程序 > 文件

如果你是这个意思? 由于您的问题并不完全清楚。

\\ 进入另一个程序

哦,好的 但是我的第一个答案也习惯了。 因为还有另一种可能性:

c:> 程序1 |程序2

它在控制台程序之间建立了一个“管道” 程序 2 在标准输入上接收程序 1 向标准输出抛出的内容 它在控制台程序中常见的老式 Unix 方式实践。 并且以这种方式不需要重写程序来专门支持它。

【讨论】:

【参考方案4】:

如果您只对程序的标准输出感兴趣,popen() 可以让这变得非常简单:

FILE* program_output = popen("command line to start the other program");
//read from program_output as you would read a "normal" file
//...
pclose(program_output);

【讨论】:

【参考方案5】:

您很可能需要使用管道来实现这一点,并且由于您使用的是 Windows,这里有一个指向 MSDN article 的链接,其中的示例似乎完全符合您的要求。

【讨论】:

以上是关于是否可以在程序运行时获得程序的输出?的主要内容,如果未能解决你的问题,请参考以下文章

如何不通过输出Log,判断某个程序运行到哪个函数?

在 ReSharper 测试运行程序中显示测试输出

从任务计划程序运行时如何重定向 PowerShell 输出?

是否可以检查程序输出重定向到文件的控制台的宽度?

用c/c++/批处理 实现如下功能, 运行指定程序,在程序结束后,输出其运行时间和内存占用大小

C#中,运行程序时提示:无法直接启动还有类库输出类型的项目?