轻轻杀死一个进程
Posted
技术标签:
【中文标题】轻轻杀死一个进程【英文标题】:Gently kill a process 【发布时间】:2009-01-13 15:11:00 【问题描述】:我有一个 Windows 服务 (C#),它生成了几个子本机进程 (C++)。
我想偶尔轻轻地杀死这些进程。 (轻轻地 = 让 proc 在停机之前完成其工作)。
我尝试使用 SetConsoleCtrlHandler() 例程将子进程注册到控制台事件,并从 C# 代码调用 CloseMainWindow() 以引发“关闭控制台”事件。
这对我不起作用。主要是因为子进程不是控制台应用程序。
有谁知道可以使用哪些其他方法来满足此要求?
【问题讨论】:
【参考方案1】:想到内核事件对象:你的“经理”引发了一个命名事件。您的子进程应至少每隔一段时间检查一次此事件的状态(或有一个持续检查它的线程)。
【讨论】:
【参考方案2】:向子进程发布消息。这可以是您自己选择的消息,因此您可以在子进程中提取消息,然后做需要做的事情,请参阅WM_USER。
【讨论】:
这需要孩子们有一个消息泵。控制台应用程序通常没有它们。而且由于您在从服务访问终端会话时遇到一些问题,我敢打赌孩子们是控制台应用程序。【参考方案3】:看看使用QueueUserAPC 的技术和我描述的here 的异常。您可能会发现它很有用。
【讨论】:
【参考方案4】:C# 有一种本地方式来访问正在运行的服务。您将需要“System.ServiceProcess”命名空间,代码应如下所示:
ServiceController[] services = ServiceController.GetServices();
for(int i = 0; i < services.Length; i++)
if (services[i].DisplayName == "COM+ System Application")
if (sc.Status == ServiceControllerStatus.Running)
sc.Stop();
if (sc.Status == ServiceControllerStatus.Stopped)
sc.Start();
【讨论】:
我的理解是,spawn children 本身并不是服务。对吗? @Serge - 实际上并没有说。它们被描述为“进程”,并描述了试图关闭它们,就好像它们是外部控制台应用程序一样,所以我假设它们是。以上是关于轻轻杀死一个进程的主要内容,如果未能解决你的问题,请参考以下文章