无缓冲CreateNamedPipe用作stdout为CreateProcess
-
21-09-2019 - |
题
我想执行任何命令行程序和阅读它的标准输出,因为它得到生产。我用 CreateNamedPipe
创建一个管,然后供电另一端(开使用 CreateFile
)来 CreateProcess
.提供目标过程中不明确地处理与标准的产出的缓冲的是有一个方法,以确保管在的问题是unbufferred或至少该系统的最小是作为缓冲区的大小?
解决方案
你真的不能控制的缓冲区的大小。你可以通过在阅读和写入缓冲区大小为1至 CreateNamedPipe
, 但核心将自动增加,这些缓冲区的大小。基本上,缓冲区将始终至少有一样大的大量数据,已经准备好要阅读,在任何给定的时间。把另一种方式,更快的响应数据的提供,和小块的数据写入管,较小的缓冲区将保持不变。
输入和输出的缓冲区大小咨询。实际缓冲区的大小保留的每个结束的名为管系统默认的、系统的最低或最高的,或者指定大小的四舍五入到下一个分配的边界。...每当一个管道写作时,该系统首先试图收取存储器对管编写的配额。...如果剩余管编写的配额太小,以满足该请求,该系统将试图扩大的缓冲区,以容纳数据使用非分页池保留的程序。
然而,我不认为在缓冲区大小,是非常重要的。管道不延迟发送的数据,直到该缓冲区"充分",没有什么相当于"nagle"选择TCP,因此维持一个小的缓冲区大小不会提高你的延迟。
请记住,当你接管的一应用程序的控制台 stdout
, 输出通常是缓冲通过该应用程序 之前 这是书面的管道。如果你想要的缓冲输出,将需要使用stderr。
此外,东西看的时候使用继承管处理的是,所产生的应用将继承所有你处理的,所以如果你有一个文件或一座开放的,你产生一个应用程序,然后关闭处理,该文件/socket/等。将继续开放,直到生孩子过程的停止,这可能会导致意想不到的共享的侵犯和其他奇怪的问题。