什么是Windows上的非缓冲程序相当于什么?

嗨根据这篇文章 , unbuffer通过伪terminal(pty)连接到一个命令,这使得系统把它视为一个交互过程,因此不使用任何stdout缓冲。

我想在Windows上使用这个function。 我可以知道什么是相当于Windows上的非unbuffer程序? 谢谢。

您所描述的行为是使用运行时库进行I / O的应用程序的典型特征。 默认情况下,大多数运行时库检查句柄是否是字符模式设备(如控制台),如果是,则不执行任何缓冲。 (理想情况下,运行时库将像处理控制台一样处理管道,但似乎大多数情况下不会)。

我不知道有什么明智的方法来欺骗这样的应用程序,使其认为它正在写入控制台,当它正在写入管道。

原则上,如果您知道需要多少数据,则可以使用控制台API函数为应用程序创建一个控制台来写入,然后从控制台读取输出。 但是你不能从Java那里做,你需要编写一个C应用程序来为你做。

类似地,原则上应该可能写出一个相当于Unix伪终端的设备驱动程序,一个像管道一样工作的设备驱动程序,但是会报告自己是字符模式设备。 但是,写设备驱动程序需要特定的专业知识,而且必须经过数字签名,所以除非现有产品存在,否则这种方法不太可行。

我花了一些时间,并成功。 我在研究期间发现了这个博客,并决定返回并提供我的解决方案,以便挽救下一个人。 我作为一个虚假的电子邮件客人回应,所以我不会互动,但不应该要求进一步的信息。

在7月18日12点在19:41哈里约翰斯顿写道:

“原则上,如果您知道需要多少数据,则可以使用控制台API函数为应用程序创建一个控制台,然后从控制台读取输出,但不能从Java那里完成,你需要写一个C程序来为你做。“

事情是,已经有一个这样做的实用程序。 它的写法稍有不同,但可以用来提供理想的结果。 它的目的是使一个Windows控制台应用程序与Linux风格的终端进行交互。 它通过运行隐藏的控制台并直接访问控制台缓冲区。 如果你试图使用它 – 你会失败。 我很幸运,发现这个实用程序有没有文档的开关,这将允许它提供简单的无缓冲输出。 如果没有这些开关,它会失败并显示错误 – 输出不是tty – 试图输出管道时。

这个工具叫做winpty。 你可以在这里得到它:

https://github.com/rprichard/winpty/releases

这里提到了无证开关:

https://github.com/rprichard/winpty/issues/103

我正在使用MSYS2版本。 你将需要msys-2.0.dll来使用它。

只需运行:

 winpty.exe -Xallow-non-tty -Xplain your_program.exe | receive_unbuffered_output.exe 

-Xallow-non-tty ,将允许管道输出

-Xplain ,将删除添加的Linux终端转义码(或任何他们被称为)

所需的文件是:

 winpty.exe winpty-agent.exe winpty.dll msys-2.0.dll 

winpty-debugserver.exe – 不需要