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

我试图find一些有关Windows上stdout的数据限制的信息。 我似乎无法findMSDN上的信息。

  1. 有多less数据可以写入标准输出有限制? 如果是这样,如果达到限制,会发生什么? 数据丢失了吗?

  2. 如果stdout被redirect(例如,通过从.Net启动进程并使用ProcessStartInfo.RedirectStandardOutput属性),那么对于可以写入多less数据有什么影响? 当我从调用过程的stdoutstream中读取时,是否会影响限制?

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

Solutions Collecting From Web of "是否有附加到标准输出的缓冲区大小?"

这取决于它的进展 – 但是,如果你重定向在.NET中的输出,你可以很容易地遇到问题,如果你不读取输出。 当缓冲区用完时,写入到子进程中的stdout将会被阻塞。 导致死锁的一个常见原因是等待“子”退出,然后读取输出的“父”进程 – 如果子进程需要父进程读取输出以释放缓冲区空间,这将不起作用。

.NET允许使用Process.OutputDataReceivedProcess.ErrorDataReceived的事件驱动方法稍微简单一些。 这意味着你不需要启动两个线程(一个读取标准输出,一个读取标准错误),以防止进程阻塞…

有些事情要记住:

1)Jon是正确的 – 如果达到缓冲区限制,你的子进程中的写入调用将被阻塞。 如果没有被重定向的地方,会导致它自动地耗尽,就像一个文件一样,你需要消耗这个stdout流。 管道需要被排空,通常,如果你可以“附加”到一个子进程的输出,你将连接到一个管道。

2)对输出流的I / O 可能被缓冲,这意味着如果子进程在不显式调用flush()的情况下将某些信息写入stdout flush()这几乎总是如此),则可能看不到输出。 当进程退出时Flush被自动调用,所以如果它是一个简短的小子进程,你应该可以,但是如果没有,你没有办法迫使它的输出在你想要的时候显示出来。

3)命名管道本质上是操作系统维护的可以写入和读取的缓冲区 – 也就是说,它们就像一个文件,你可以从一个进程写入并从另一个进程中读取,而实际上没有磁盘上的文件。 进程之间的通信非常方便,但缓冲区/满缓冲区的所有I / O限制仍然适用。

stdout有一个1024字节的缓冲区