父进程退出会导致子进程挂起

时间:2017-02-24 05:07:08

标签: c# c windows winapi

我有一对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);

更新:我刚试了一次测试,我拿出了RedirectStandardOutputRedirectStandardError所以大概是而不是一个管道情况,问题仍然发生了同样的方式,毕竟它似乎与重定向和破损的管道无关。

0 个答案:

没有答案