Articles of 标准输出

为什么在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())。

是否有附加到标准输出的缓冲区大小?

我试图find一些有关Windows上stdout的数据限制的信息。 我似乎无法findMSDN上的信息。 有多less数据可以写入标准输出有限制? 如果是这样,如果达到限制,会发生什么? 数据丢失了吗? 如果stdout被redirect(例如,通过从.Net启动进程并使用ProcessStartInfo.RedirectStandardOutput属性),那么对于可以写入多less数据有什么影响? 当我从调用过程的stdoutstream中读取时,是否会影响限制? 这些限制是否与命名pipe道有关?

用超时和捕捉输出叉subprocess

说我有一个像下面的函数,我如何捕获Process.spawn调用的输出? 如果超过指定的超时时间,我也应该能够终止进程。 请注意,该function也必须是跨平台的(Windows / Linux)。 def execute_with_timeout!(command) begin pid = Process.spawn(command) # How do I capture output of this process? status = Timeout::timeout(5) { Process.wait(pid) } rescue Timeout::Error Process.kill('KILL', pid) end end 谢谢。

用Python 3打印LF到stdout

如何得到\n打印到Windows上的标准输出? 此代码在Python 2中工作,但不在Python 3中工作: # set sys.stdout to binary mode on Windows import sys, os, msvcrt msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) # the length of testfile created with # python test_py3k_lf_print.py > testfile # below should be exactly 4 symbols (23 0A 23 0A) print("#\n#")