Ole*_*lin 7 winapi pipe createprocess named-pipes output-buffering
我想执行任意命令行应用程序并在生成时读取其标准输出。我用来CreateNamedPipe创建一个管道,然后将另一端(打开使用的CreateFile)提供给CreateProcess。如果目标进程没有显式地使用标准输出缓冲进行操作,是否有一种方法可以确保有问题的管道没有缓冲,或者至少使用系统最小值作为缓冲区大小?
您无法真正控制缓冲区大小。您可以传入 1 到 的读取和写入缓冲区大小CreateNamedPipe,但内核会自动增加这些缓冲区大小。基本上,缓冲区将始终至少与任何给定时间已准备好读取的最大数据量一样大。换句话说,对可用数据的响应速度越快,写入管道的数据块越小,保留的缓冲区就越小。
输入和输出缓冲区大小是建议性的。为命名管道每一端保留的实际缓冲区大小可以是系统默认值、系统最小值或最大值,或者向上舍入到下一个分配边界的指定大小。...每当发生管道写入操作时,系统首先尝试根据管道写入配额对内存进行充电。...如果剩余的管道写入配额太小而无法满足请求,系统将尝试使用为进程保留的非分页池来扩展缓冲区以容纳数据。
但是,我认为缓冲区大小并不真正重要。管道不会延迟数据的发送,直到缓冲区“满”为止,并且没有什么相当于 TCP 的“nagle”选项,因此保持较小的缓冲区大小不会改善延迟。
请记住,当您将管道连接到控制台应用程序时stdout,输出通常会在写入管道之前由该应用程序缓冲。如果您想要无缓冲输出,则需要使用 stderr。
另外,使用继承的管道句柄时需要注意的是,生成的应用程序将继承所有句柄,因此,如果您打开了一个文件或套接字,则生成一个应用程序,然后关闭该句柄、文件/套接字等。将保持打开状态,直到生成的子进程停止,这可能会导致意外的共享冲突和其他奇怪的问题。