gpt4 book ai didi

c# - stdout 和 stderr 的 Process.Start 缓冲区大小是多少?

转载 作者:行者123 更新时间:2023-12-02 12:58:51 25 4
gpt4 key购买 nike

我正在尝试找出该信息。显然,微软尚未提供可靠地读取进程 stdoutstderr 的代码,而不会出现死锁、异常和其他问题。

死锁问题

http://www.codeducky.org/process-handling-net/

A less-obvious problem is that of deadlocking. All three process streams (in, out, and error) are finite in how much content they can buffer. If the internal buffer fills up, then whoever is writing to the stream will block. In this code, for example, we don’t read from the out and error streams until after the process has exited. That means that we could find ourselves in a case where external process exhausts it’s error buffer. In that case, external process would block on writing to standard error, while our .NET app is blocked reading to the end of standard out. Thus, we’ve found ourselves in a deadlock!

<小时/>

互联网上没有可靠的代码

有一个被投票 265 次的答案,但我不会使用它,因为它遇到 ObjectDisposeException 并需要超时:
ProcessStartInfo hanging on "WaitForExit"? Why?

在发现它可能导致 ObjectDisposeException 之前,它可能已经被投票了。

<小时/>

发生死锁的可能性有多大?

我想知道陷入僵局的可能性有多大。为此,我需要知道 Windows 7 下 stderr 和 stdout 的缓冲区大小。

如何找到他们?我以为我可以对几个文件进行cat,看看大概的文件大小会导致问题,但在Windows 7下没有cat。我什至尝试使用git cat-file,但它的文档很糟糕,没有使用示例并且没有人回答相关问题:https://stackoverflow.com/questions/43203902/how-to-git-cat-file-a-file-in-current-dir

最佳答案

约翰的评论是正确的,它被硬编码为 4096 字节。

https://github.com/Microsoft/referencesource/blob/master/System/services/monitoring/system/diagnosticts/Process.cs

    if (startInfo.RedirectStandardInput) {
standardInput = new StreamWriter(new FileStream(standardInputWritePipeHandle, FileAccess.Write, 4096, false), Console.InputEncoding, 4096);
standardInput.AutoFlush = true;
}
if (startInfo.RedirectStandardOutput) {
Encoding enc = (startInfo.StandardOutputEncoding != null) ? startInfo.StandardOutputEncoding : Console.OutputEncoding;
standardOutput = new StreamReader(new FileStream(standardOutputReadPipeHandle, FileAccess.Read, 4096, false), enc, true, 4096);
}
if (startInfo.RedirectStandardError) {
Encoding enc = (startInfo.StandardErrorEncoding != null) ? startInfo.StandardErrorEncoding : Console.OutputEncoding;
standardError = new StreamReader(new FileStream(standardErrorReadPipeHandle, FileAccess.Read, 4096, false), enc, true, 4096);

}

我已经通过运行 cmd.exe type path\to\file.html 命令对此进行了测试,但它打印的输出减少了,因此我编写了一行 ruby​​ 脚本来打开文件并打印它到标准输出。 4373 字节文件失败,3007 字节文件运行。它只是挂起,陷入僵局。

Microsoft IMO 的流程处理真的很可悲。

关于c# - stdout 和 stderr 的 Process.Start 缓冲区大小是多少?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43204624/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com