2009-10-14 125 views
4

我想执行任意命令行应用程序和,因为它得到产生读取其标准输出。我用CreateNamedPipe创建管道,然后提供另一端(开放用CreateFile)至CreateProcess。假如目标进程没有用标准输出缓冲显式操作,有没有办法确保所讨论的管道是未缓冲的或至少系统最小值被用作缓冲区大小?无缓冲CreateNamedPipe时用作标准输出为CreateProcess的

回答

4

你真的无法控制的缓冲区的大小。您可以传递1到CreateNamedPipe的读取和写入缓冲区大小,但内核将自动增加这些缓冲区大小。基本上,缓冲区总是至少与在任何给定时间已经准备好读取的最大量的数据一样大。换句话说,对数据可用的响应速度越快,写入管道的数据块越小,缓冲区将保留得越小。

输入和输出缓冲器尺寸是咨询。为命名管道的每端保留的实际缓冲区大小可以是系统默认值,系统最小值或最大值,也可以是指定大小四舍五入到下一个分配边界。 ...每当管道写入操作发生时,系统首先尝试按管道写入配额对内存充电。 ...如果剩余管道写入配额太小而无法满足请求,系统将尝试扩展缓冲区以使用为进程保留的非分页池来容纳数据。

不过,我不认为缓冲区大小是非常重要的。管道不会延迟发送数据,直到缓冲区为“满”,并且没有任何与TCP的“nagle”选项等效,因此保持较小的缓冲区大小不会延长您的延迟时间。

请记住,当您将管道连接到控制台应用程序的stdout时,输出通常会在之前被该应用程序缓冲,并被写入管道。如果你想要无缓冲的输出,你将需要使用stderr。

此外,使用继承的管道句柄时要注意的一点是生成的应用程序将继承所有的句柄,因此如果您打开了文件或套接字,则生成一个应用程序,然后关闭该句柄,该文件/插座/等。将保持开放状态,直到产生的子进程停止,这可能会导致意外的共享冲突和其他奇怪的问题。