什么是无缓冲程序在Windows上的相同呢?(What is the equivalent of u

2019-06-17 11:17发布

您好根据这篇文章 , unbuffer经由伪终端(PTY),这使得该系统把它作为一个互动的过程,因此不使用任何标准输出缓冲连接到命令。

我想利用这个功能在Windows上。 我想知道什么是相当于unbuffer程序在Windows? 谢谢。

Answer 1:

您所描述的行为是典型的使用运行时库的I / O应用。 默认情况下,大多数运行时库检查,看手柄是否是一个字符模式装置,如控制台,如果是这样,他们没有做任何缓冲。 (理想情况下,运行时库会以同样的方式作为控制台处理管道,但似乎大多数人没有。)

我不知道有任何合理的方式来欺骗这样的应用程序,以为它是写入控制台时,它实际上是写入管道。

附录:七年后, 最后的Windows支持pseudoconsoles 。 如果您在Windows 10 v1809或更高版本上运行,这个新的API应该解决您的问题。

在旧版本的Windows,如果你知道有多少数据要想到,你可以在原则上使用控制台API函数来创建一个控制台应用程序写入,然后读取从控制台输出。 但是你不能做到这一点从Java,你需要写一个C程序来为你做它。

类似地,在原则上就应该大概可以写一个设备驱动程序相当于一个Unix伪终端,一个行为象一个管道,但报告本身是一个字符模式的装置。 但是,编写设备驱动程序,需要特定的专业知识,他们必须进行数字签名,因此,除非有一个现有的产品在那里这种做法不太可能是可行的。



Answer 2:

我花了一些这方面的时间和成功。 我发现这个博客的研究过程中,并决定返回,并提供我的解决方案,以节省未来的家伙一段时间。 我响应与虚假的电子邮件,所以我不会被交互的客人,但应该不需要进一步的信息。

在7月18日在'12 19:41哈利·约翰斯顿写道:

“原则上,如果你知道有多少数据预期,你可以使用控制台API函数来创建一个控制台应用程序写入,然后读取从控制台输出,但你不能做到这一点从Java,你需要写一个C程序来为你做它。”

事情是,已经有一个实用程序,做到这一点。 它是一个稍微不同的用途写的,但它可以coxed成提供期望的结果。 其预期目的是使Windows控制台应用程序与Linux的风格TTY终端进行交互。 它通过运行一个隐藏控制台做到这一点并直接访问控制台缓冲区。 如果您尝试使用它 - 你会失败。 我很幸运,发现有此实用程序,这将允许它提供简单的无缓冲输出无证开关。 没有开关它失败,错误 - 输出不是一个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 - 没有必要



Answer 3:

免责声明:我的答案只能用MSVC编译执行交易。

缓冲策略为Microsoft C运行时(CRT)库的内部编码。 你可以学习的细节在这里 。 本文建议使用控制台手柄和操作控制台缓冲区接收缓冲输出。

然而,有Microsoft C运行时内无证功能继承文件使用一些内部直接从它的父进程的标志处理lpReserved2cbReserved2领域STARTUPINFO结构。 你可以在微软的Visual Studio提供的CRT源代码的细节。 或者搜索类似posfhnd GitHub上。

我们可以利用这个无证功能提供一个管道句柄,并指定FOPEN | FDEV FOPEN | FDEV标志子进程,愚弄子进程处理该管道处理方式相同FILE_TYPE_CHAR手柄。

我有一个工作Python3脚本来证明这种方法。



文章来源: What is the equivalent of unbuffer program on Windows?