【问题标题】:Kill process by name按名称杀死进程
【发布时间】:2011-06-19 06:09:40
【问题描述】:

如何在仅使用 API 函数的 Windows 上按名称终止进程?

【问题讨论】:

  • 什么操作系统?什么平台?

标签: windows kill-process


【解决方案1】:

在一个 cmd 窗口中你可以使用taskkill /F /im cmd.exe 来杀死所有的 cmd.exe 程序。

/T 标志告诉 taskkill 强制终止进程,而 taskkill /im cmd.exe 通过发送终止信号优雅地关闭它。

更多关于taskkill的信息可以在here找到

另一个终止进程的好工具是wmic

【讨论】:

    【解决方案2】:

    假设您的意思是在 Windows 上,请使用 ZwQuerySystemInformationTerminateProcess。有关详细示例,请参见此处:How to kill a process given a name

    【讨论】:

      【解决方案3】:

      如果杀死你的意思是带着极端偏见终止,那么总是有终止进程。如果您能找到其他方式(例如将 WM_CLOSE 发布到主窗口),我建议您不要使用它,因为当您调用 TerminateProcess 时,加载的 DLL 不会正确卸载,因此使用的资源可能不会被释放。

      真正的问题是如何从名称中获取进程ID,这通常涉及

      EnumProcesses()
      EnumProcessModules()
      GetModuleFileNameEx()
      GetModuleBaseName()

      并将生成的基本模块名称与您要查找的名称进行比较。但是在系统上执行的模块名称可能不止一个实例。在这种情况下,您将如何区分实例?

      【讨论】:

        【解决方案4】:
        killall yourprocess
        

        http://en.wikipedia.org/wiki/Killall(请注意,这只适用于 Linux,因为您尚未指定操作系统)

        【讨论】:

        • 请注意,这会杀死所有名称为 yourprocess 的进程。如果您有此流程的多个实例,这可能是个问题。
        • @Juri Glass:确实。唉,仅凭名字是无法区分它们的。你可以pgrep 然后kill 只有第一个,但这仍然不能解决任何问题 - 你怎么知道它是正确的?你没有。
        • @Gilboss:好的。在问题中提供足够的细节是有意义的 - 这样您就会得到相关的答案。
        猜你喜欢
        • 2011-02-25
        • 1970-01-01
        • 2017-10-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-01-21
        • 2018-02-28
        • 1970-01-01
        相关资源
        最近更新 更多