我有一对Windows控制台程序,父编写C#,孩子用C编写;父调用子文件名作为参数,输出,等待退出,再次使用数据文件列表中的下一个调用,依此类推。浏览整个数据文件列表可能需要花费很多时间,因此在测试中我通常希望使用^ C终止父进程,确定是否有任何子进程仍在运行,如果它没有因此而死,则应该是几秒钟之后被它设定的计时器杀死了。
实际发生的是父进程退出,我得到了控制台,但子进程仍然在后台,没有使用CPU,永久挂起直到被任务管理器杀死。为什么会发生这种情况,以及如何防止这种情况发生?
父进程调用代码:
var worker = new Process()
{
StartInfo = new ProcessStartInfo("/ayane/ayane.exe", "-t=10 " + filename)
{
RedirectStandardError = true,
RedirectStandardOutput = true,
UseShellExecute = false,
}
};
worker.Start();
var output = worker.StandardOutput.ReadToEnd();
worker.WaitForExit();
子代码,如果几秒钟内没有完成,则设置一个计时器来终止进程:
static VOID CALLBACK timeout(PVOID a, BOOLEAN b) { ExitProcess(0); }
...
HANDLE timer = 0;
CreateTimerQueueTimer(&timer, 0, timeout, 0, (DWORD)(time_limit * 1000),
0, 0);
更新:我刚试了一次测试,我拿出了RedirectStandardOutput
和RedirectStandardError
所以大概是而不是一个管道情况,问题仍然发生了同样的方式,毕竟它似乎与重定向和破损的管道无关。