Articles of 标准输出

Windows控制台程序stdout在使用pipe道redirect时被缓冲

我有一个长期运行的服务器程序(比如程序A),它是用QT / c ++编写的。 该程序是不是很稳定,所以我决定写一个python脚本来重新启动它,如果它崩溃。 问题是程序可能开始失败(如果我给它一个使用中的端口),打印错误,然后挂在那里没有退出,所以我必须监视程序的标准输出,并在失败的启动时杀死它。 这是我的最终代码(呃,其实这是好的,你可以忽略它): self.subp = subprocess.Popen( r'.\A.exe -server %d' % portnum, stdout=subprocess.PIPE, bufsize=1) for line in iter(self.subp.stdout.readline, ''): print(line, end='') 但我发现我不能从subprocess的标准输出读取任何东西,readline方法只是阻止那里,如果我杀了一个进程,python脚本只是退出没有任何输出。 在一开始,我认为这是一个subprocess模块的问题,但经过一些testing,我发现它不是。 如果我用一些其他的Windows控制台程序replaceA.exe命令行,ping -t例如,一切工作正常。 所以我认为这可能是A程序的问题。 幸运的是,我有A的源代码,这里是一个输出处理: printf("Server is starting on port %u\n", Config.ServerPort); if(server->listen()) printf("Starting successfully\n"); else printf("Starting failed!\n"); 经过一些search,我添加fflush(stdout); 到这段代码的末尾,重build程序,现在它工作 所以我的问题是,我还是不明白,原来的A程序代码有什么问题? 不用强制刷新,它可以在程序启动后立即在Windows控制台中正确打印这些string。 为什么在输出上使用pipe道时输出缓冲? 我在标准c实现读取,输出将自动刷新换行,但为什么不在我的情况? 这是一个Windows的问题,或编译器的问题? A程序是用QT / C ++编译的,QT版本是4.7.4(x32),C ++编译器是用QT(GCC […]

在程序运行的时候可以获得程序的输出吗?

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

为什么在redirect输出时调整控制台缓冲区会引发无效句柄exception?

在将输出redirect到文件时,调整C#控制台应用程序中的Console.BufferWidth会引发exception。 我们来看一个例子test1.exe: static void Main(string[] args) { Console.BufferWidth = 240; Console.WriteLine("output1\noutput2"); } 标准输出很好: test1.exe output1 output2 redirect到文件引发exception: test1.exe > file.txt Unhandled Exception: System.IO.IOException: The handle is invalid. at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) at System.IO.__Error.WinIOError() at System.Console.SetBufferSize(Int32 width, Int32 height) at System.Console.set_BufferWidth(Int32 value) at test1.Program.Main(String[] args) in \\wopr\falken\test1\Program.cs:line 13 很容易忽略使用try … catch,但有一些我一般不理解的文件句柄或句柄。 为什么句柄无效?

Windows上的System.err在哪里?

我有一个基于Java GUI的应用程序,它将一些诊断消息写入System.out和System.err。 在Windows上运行时,这些消息在哪里输出? (例如,在Mac OS X上,它们被打印到系统控制台日志中。) 编辑 我应该补充说,Java应用程序打包成.exe,所以(现在)我不能启动它使用java 。 (我想可以将单个.JAR文件复制到Windowstesting机器上。) 另外,这是我inheritance的一个应用程序,之前没有使用日志框架。 我想修改它使用一个,但我希望能够快速获得一些日志输出来诊断问题。

以二进制模式写入标准输出最简单的方法是什么?

我一直在想出从C程序写入二进制数据到stdout的最好方法。 它在Linux上正常工作,但是当我在Windows上编译时遇到了问题,因为“\ n”被转换为“\ r \ n”。 有没有一种标准的方式写入标准输出的某种二进制模式,避免换行符? 如果没有,让Windows停止这个最简单的方法是什么? 我正在使用GCC和MinGW。

在cpp中redirect标准输出

我几天前一直在寻找这个问题的答案,希望你们能帮助我。 (我已经search并find了一些解决scheme,但每个都有自己的问题…)。 这是事情:我正在写一个自动化的工作,它负责启动由我的同事编写的代码的外部“.exe”文件。 由于这些程序是写给客户的,所以我不能对其代码进行任何修改。 这些程序一旦启动,正在等待特定的击键,并在收到合法的击键时打印一条消息。 我的目标是:编写一个程序,执行外部程序,发送按键,并从他们的标准输出接收输出。 到目前为止,我已经能够从我的程序(使用ShellExecute)运行程序,并将某种键盘监听器(使用SendMessage)模拟到另一个程序。 我可以看到它的工作原理 – 我可以看到testing程序的控制台中的输出。 我试图在testing程序的shell中实时地获取打印的消息(并在程序终止时获取大量数据),以便在出现问题时对其进行分析。 那些我试过的: 使用内联输出redirect将外部batch file写入文本文件。 使用freopen。 在执行“ShellExecute”的同时redirect输出。

禁用缓冲redirect标准输出pipe道(Win32 API,C ++)

我使用CreateProcess从Win32生成一个进程,将STARTUPINFO的hStdOutput和hStdError属性设置为用CreatePipe创build的pipe道句柄。 我有两个线程读取pipe道,等待数据变为可用(或者进程完成,在此之前它检查在终止线程之前没有剩下数据)。 随着数据变得可用,我将输出写入一个有效的大文本框。 发生什么事是输出被缓冲,所以一个缓慢运行的过程只是获取文本框中的大块数据,而不是“正好发生”。 我不确定是否是进行缓冲的pipe道,或者与redirect有关。 有什么办法可以将pipe道设置为无缓冲的,或者以尽可能快的方式发送标准输出来启动进程? 我正在testing一个testing应用程序,相隔一秒打印行 Here is line one (waits one second) Here is line two (waits one second) … etc

强制另一个程序的标准输出使用Python无缓冲

python脚本正在控制Linux上的外部应用程序,通过pipe道将input传递到外部应用程序stdin,并通过pipe道从外部应用程序stdout读取输出。 问题在于对pipe道的写入是通过块进行缓冲的,而不是通过线路进行缓冲,因此在控制脚本接收到外部应用程序中的printf输出数据之前发生延迟。 外部应用程序不能被改变来添加显式的fflush(0)调用。 Python标准库的pty模块如何与子stream程模块一起使用来实现这一目标?

freopen标准输出和控制台

鉴于以下function: freopen("file.txt","w",stdout); 将stdoutredirect到一个文件中,我如何使stdoutredirect到控制台? 我会注意到,是的,还有类似的其他问题, 但他们是关于Linux / POSIX。 我正在使用Windows。 你不能分配给标准输出,这将依赖于它的一组解决scheme无效。 dup和dup2()不是原生的窗口,取消其他集合。 如上所述,posix函数不适用(除非你计算fdopen())。