我想执行任何命令行程序和阅读它的标准输出,因为它得到生产。我用 CreateNamedPipe 创建一个管,然后供电另一端(开使用 CreateFile)来 CreateProcess.提供目标过程中不明确地处理与标准的产出的缓冲的是有一个方法,以确保管在的问题是unbufferred或至少该系统的最小是作为缓冲区的大小?

有帮助吗?

解决方案

你真的不能控制的缓冲区的大小。你可以通过在阅读和写入缓冲区大小为1至 CreateNamedPipe, 但核心将自动增加,这些缓冲区的大小。基本上,缓冲区将始终至少有一样大的大量数据,已经准备好要阅读,在任何给定的时间。把另一种方式,更快的响应数据的提供,和小块的数据写入管,较小的缓冲区将保持不变。

输入和输出的缓冲区大小咨询。实际缓冲区的大小保留的每个结束的名为管系统默认的、系统的最低或最高的,或者指定大小的四舍五入到下一个分配的边界。...每当一个管道写作时,该系统首先试图收取存储器对管编写的配额。...如果剩余管编写的配额太小,以满足该请求,该系统将试图扩大的缓冲区,以容纳数据使用非分页池保留的程序。

然而,我不认为在缓冲区大小,是非常重要的。管道不延迟发送的数据,直到该缓冲区"充分",没有什么相当于"nagle"选择TCP,因此维持一个小的缓冲区大小不会提高你的延迟。

请记住,当你接管的一应用程序的控制台 stdout, 输出通常是缓冲通过该应用程序 之前 这是书面的管道。如果你想要的缓冲输出,将需要使用stderr。

此外,东西看的时候使用继承管处理的是,所产生的应用将继承所有你处理的,所以如果你有一个文件或一座开放的,你产生一个应用程序,然后关闭处理,该文件/socket/等。将继续开放,直到生孩子过程的停止,这可能会导致意想不到的共享的侵犯和其他奇怪的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top