轻轻杀死一个进程

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 - 实际上并没有说。它们被描述为“进程”,并描述了试图关闭它们,就好像它们是外部控制台应用程序一样,所以我假设它们是。

以上是关于轻轻杀死一个进程的主要内容,如果未能解决你的问题,请参考以下文章

Android可以彻底杀死一个进程吗

如何杀死一个知道pid的进程

如何使用子进程模块杀死(或避免)僵尸进程

linux杀死进程怎么一下子全部杀死

通过其子进程分析一个进程并在之后杀死该子进程

如何杀死僵尸进程