【问题标题】:kill child process when parent dies [duplicate]当父母死亡时杀死子进程[重复]
【发布时间】:2014-09-16 01:57:53
【问题描述】:

我正在使用下面的代码创建多个进程,并且我想在它们的父级死亡时将它们全部杀死。

Process p = new Process();
p.StartInfo.FileName = @"G:\test.exe";
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.UseShellExecute = true;
p.StartInfo.RedirectStandardOutput = false;
p.Start();

1- 我搜索了很多,但找不到解决方案。 唯一有用的解决方案是:

Solution

但我在这一行有错误Win32.CloseHandle(m_handle);

2- 我正在使用 .netframework 3.5,但无法使用任务。

3- 我使用了p.WaitForExit();,但我的主窗体冻结了。

有什么方法可以在不冻结表单的情况下杀死父进程上的进程?

【问题讨论】:

  • 感谢您的回复。我看到了那个帖子,但 Win32.CloseHandle(m_handle); 仍然有问题。 . win7下不行
  • 使用 SafeHandle 代替。
  • 您的意思是“Microsoft.Win32.SafeHandles.SafeFileHandle”?在我的工作域中,我有 win7 和 winxp,(32 位和 64 位)。它们都适用吗?
  • 在该帖子的第三条评论中,Alexander Yezutov 写道:“不幸的是,我无法在 64 位模式下运行它。这里我发布了一个基于此的工作示例。”并给出了解决方案:*.com/questions/6266820/…。但我仍然有 Windows 版本和 Win32.CloseHandle(handle); 的问题

标签: c# windows-7 process


【解决方案1】:

在您的应用程序结束时终止该进程。您可以在主窗体应用程序中注册Form.Closing

private void Form1_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
    Process [] localByName = Process.GetProcessesByName("yoursubprocess");
    foreach (var process in processes) 
    {
        process.Kill() ; 
    }
}

编辑

yoursubprocess :您要杀死的子进程名称。不是主进程

【讨论】:

  • 它适用于 form_closing() 但如果我从任务管理器中终止我的应用程序,子进程不会被终止
  • 我对帖子进行了编辑
【解决方案2】:

从子进程名称看来,您是他们的作者。然后,您可以使用任何形式的 IPC 来简单地告诉孩子“请关闭”,而不是杀死进程。

最简单的例子

// in main application
Mutex mutex = new Mutex(true, "MyMutexWithUniqueName");
... do job here
mutex.ReleaseMutex(); // on exit

// in children
Mutex mutex = Mutex.OpenExisting("MyMutexWithUniqueName");
if(mutex.WaitOne(0)) // poll
{
    mutex.ReleaseMutex();
    ... exit process
}

【讨论】:

    【解决方案3】:

    您可以将您的流程存储在一个列表中。 每次创建一个时,将其添加到列表中。然后在主进程关闭时,您只需要一一停止它们。 不是吗?

    【讨论】: