我想执行任意命令行应用程序和,因为它得到产生读取其标准输出。我用CreateNamedPipe
创建管道,然后提供另一端(开放用CreateFile
)至CreateProcess
。假如目标进程没有用标准输出缓冲显式操作,有没有办法确保所讨论的管道是未缓冲的或至少系统最小值被用作缓冲区大小?无缓冲CreateNamedPipe时用作标准输出为CreateProcess的
4
A
回答
4
你真的无法控制的缓冲区的大小。您可以传递1到CreateNamedPipe
的读取和写入缓冲区大小,但内核将自动增加这些缓冲区大小。基本上,缓冲区总是至少与在任何给定时间已经准备好读取的最大量的数据一样大。换句话说,对数据可用的响应速度越快,写入管道的数据块越小,缓冲区将保留得越小。
输入和输出缓冲器尺寸是咨询。为命名管道的每端保留的实际缓冲区大小可以是系统默认值,系统最小值或最大值,也可以是指定大小四舍五入到下一个分配边界。 ...每当管道写入操作发生时,系统首先尝试按管道写入配额对内存充电。 ...如果剩余管道写入配额太小而无法满足请求,系统将尝试扩展缓冲区以使用为进程保留的非分页池来容纳数据。
不过,我不认为缓冲区大小是非常重要的。管道不会延迟发送数据,直到缓冲区为“满”,并且没有任何与TCP的“nagle”选项等效,因此保持较小的缓冲区大小不会延长您的延迟时间。
请记住,当您将管道连接到控制台应用程序的stdout
时,输出通常会在之前被该应用程序缓冲,并被写入管道。如果你想要无缓冲的输出,你将需要使用stderr。
此外,使用继承的管道句柄时要注意的一点是生成的应用程序将继承所有的句柄,因此如果您打开了文件或套接字,则生成一个应用程序,然后关闭该句柄,该文件/插座/等。将保持开放状态,直到产生的子进程停止,这可能会导致意外的共享冲突和其他奇怪的问题。
相关问题
- 1. 红宝石IO.popen标准输出缓冲
- 2. CreateProcess并捕获标准输出
- 3. 无法使用CreateProcess重定向标准输出
- 4. 为什么要缓冲子进程的标准输出(重定向到无缓冲文件)?
- 5. 无缓冲Bash输出
- 6. 非缓冲标准输入读取
- 7. 使用无缓冲输出的suPHP?
- 8. 为什么在多线程时关闭标准输出缓冲区?
- 9. 使用cout无缓冲输出
- 10. 如何在C++中打印缓冲区到标准输出?
- 11. Vim在标准输出上打印缓冲区名称:q
- 12. 派生child_process标准输出到'readline'没有缓冲节点?
- 13. PHP输出缓冲不起作用!
- 14. C++的ReadFile,CreateProcess的,管标准输出重定向,加倍输出
- 15. 如何从标准输出和stderr中记录输出而不缓冲
- 16. Perl - 从外部进程直接输出到标准输出(避免缓冲)
- 17. libdtrace缓冲输出
- 18. PHP输出缓冲
- 19. Perl缓冲输出
- 20. 输出缓冲区
- 21. 缓冲输出流
- 22. Common Lisp:冲洗标准输出
- 23. 结算冲洗标准输出
- 24. 缓冲读取使用fread中的标准输入C
- 25. 使用Paramiko的标准输出作为标准输入与子流程
- 26. 来自内存缓冲区的CreateProcess
- 27. GNU无线电输入和输出缓冲区如何工作?
- 28. 使用PHP输出缓冲区压缩缓存的输出
- 29. Python:同时使用标准输入和标准输出
- 30. PHP输出缓冲不工作