我read这部分代码可能导致死锁:
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "Write500Lines.exe";
p.Start();
p.WaitForExit();
string output = p.StandardOutput.ReadToEnd();
因为
如果出现死锁情况 父进程调用
p.WaitForExit
在p.StandardOutput.ReadToEnd
和之前 子进程写入足够的文本 填充重定向的流。该 父进程会无限期地等待 让子进程退出。该 子进程会无限期地等待 为父母从完整阅读 StandardOutput流。
但我不是为什么。我的意思是,在这种情况下,父进程是什么,孩子是什么?
答案 0 :(得分:12)
简而言之,可能会发生这种情况:
应用程序A(上面的代码)启动子进程B并重定向标准输出。然后A等待B进程退出。当A等待B退出时,B产生输出到输出流(A已重定向)。此流具有有限的缓冲区大小。如果缓冲区变满,则需要清空缓冲区以便B能够继续写入缓冲区。由于A在B退出之前没有读取,因此最终可能会出现B等待输出缓冲区被清空的情况,而A将等待B退出。两个人都在等待对方采取行动,你就陷入了僵局。
您可以尝试以下代码来演示问题:
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "cmd";
psi.Arguments = @"/c dir C:\windows /s";
psi.RedirectStandardOutput = true;
psi.UseShellExecute = false;
Process p = Process.Start(psi);
p.WaitForExit();
string output = p.StandardOutput.ReadToEnd();
这将(很可能)产生输出流已满的情况,以便子进程(在这种情况下为"cmd"
)将等待它被清除,而上面的代码将等待{{ 1}}完成。
答案 1 :(得分:0)
父进程是调用p.Start()
的进程。我想这是你的应用程序(调用者)。
子进程是p
或换句话说是被调用者。