是否有缓冲区大小附加到标准输出?

时间:2010-01-14 17:48:08

标签: .net windows buffer stdout

我试图在Windows上找到与stdout相关的数据限制的一些信息。我似乎无法在MSDN上找到这些信息。

  1. 是否可以向stdout写入多少数据?如果是这样,如果达到限制会发生什么?数据丢失了吗?

  2. 如果重定向stdout(例如,通过从.Net启动进程并使用ProcessStartInfo.RedirectStandardOutput属性),这对可以写入多少数据有影响吗?当我从调用过程中的stdout流中读取时,这是否会影响限制?

  3. 这些限制是否与命名管道有关?

3 个答案:

答案 0 :(得分:19)

这取决于它的发展方向 - 但是,如果您在.NET中重定向输出,如果您不读取输出,则很容易遇到问题。当缓冲区用完时,子进程中对stdout的写入将被阻塞。导致死锁的常见原因是“父”进程等待“子”退出,然后读取输出 - 如果子进程需要父进程读取输出以释放缓冲区空间,则无法正常工作。 / p>

.NET允许使用Process.OutputDataReceivedProcess.ErrorDataReceived的事件驱动方法,从而使这一点变得更加容易。这意味着你不需要启动两个线程(一个读取stdout,一个读取stderr)只是为了防止进程阻塞......

答案 1 :(得分:4)

要记住的一些事情:

1)Jon是对的 - 如果达到缓冲区限制,子进程中的写入调用将被阻止。如果没有将stdout流重定向到某个会导致它自动耗尽的文件,你需要排空stdout流。管道需要耗尽,通常,如果您可以“附加”到子流程的输出,则需要连接到管道。

2)输出流的I / O 可能缓冲,这意味着如果子进程将某些信息写入stdout而不显式调用flush(),这几乎总是如此,你可能看不到输出。当进程退出时会自动调用Flush,所以如果它是一个简短的小子进程你应该没问题,但如果没有,你就没有真正的方法强制它的输出显示在你想要的时候。

3)命名管道本质上是OS维护的可以写入和读取的缓冲区 - 也就是说,它们就像一个文件,你可以从一个进程写入并从另一个进程读取,而不是实际拥有在磁盘上安装文件的开销。非常方便进程之间的通信,但缓冲/完全缓冲区的所有I / O限制仍然适用。

答案 2 :(得分:3)

stdout有一个1024字节的缓冲区