是否可以在程序运行时获得程序的输出?
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 的链接,其中的示例似乎完全符合您的要求。
【讨论】:
以上是关于是否可以在程序运行时获得程序的输出?的主要内容,如果未能解决你的问题,请参考以下文章
从任务计划程序运行时如何重定向 PowerShell 输出?