【问题标题】:What are the differences between kill process and close process?杀死进程和关闭进程有什么区别?
【发布时间】:2012-12-06 19:40:46
【问题描述】:

当我启动一个进程并想关闭这个进程时,Process.Close()Process.Kill()有什么区别?

我问是因为我有一个应用程序,它开始使用 Wireshark 捕获数据包,并通过带有Windows = hidden 的命令行命令。 所以当我想停止捕获时,我会终止进程。所以有时捕获打开时会出现最后一个数据包在中间被剪切的错误,所以我想知道在kill() 之前使用close() 可以解决这个问题吗?

当我开始捕获时,我可以按 Ctrl + C 将其关闭,但在我的情况下,我以隐藏状态打开窗口,我可以通过我的代码执行类似的操作吗?

【问题讨论】:

标签: c# process


【解决方案1】:

Process.Close()process.Kill() 有什么区别?

手册对此非常清楚:

Process.Close():

如果进程正在等待,Close 方法会导致进程停止等待退出,关闭进程句柄,并清除特定于进程的属性。 Close 不会关闭标准输出、输入和错误读取器和写入器,以防它们被外部引用。 [IE。进程本身一直在运行,您无法再使用 Process 实例控制它]

Process.Kill():

Kill 强制终止进程,而 CloseMainWindow 只请求终止。 [...] 通过调用 CloseMainWindow 退出进程的请求不会强制应用程序退出。应用程序可以在退出前要求用户验证,也可以拒绝退出。要强制应用程序退出,请使用 Kill 方法。 CloseMainWindow 的行为与用户使用系统菜单关闭应用程序主窗口的行为相同。因此,通过关闭主窗口来退出进程的请求并不强制应用程序立即退出。

Process.CloseMainWindow

通过向其主窗口发送关闭消息来关闭具有用户界面的进程。


至于您的编辑:

我问是因为我有应用程序开始使用带有命令的wireshark 来捕获数据包,该命令通过Windows = hidden 的命令行。

Use the WinPcap APIPcap.Net library for that,而不是 Wireshark。

【讨论】:

  • 当我开始捕获时,我可以按 Ctrl + C 将其关闭,但在我的情况下,我以隐藏状态打开窗口,我可以用这个做些什么吗?
  • @user1710944 我不明白你的评论,但你真的应该看看 WinPcap API。在隐藏窗口中运行程序并不是真正推荐使用其逻辑和数据的方式,这就是 API 的用途。
  • 当我有以下情况时,我不确定“关闭不会关闭标准输出、输入和错误读取器和写入器,以防它们被外部引用”:p.Close(); p.StandardOutput.Close();它因以下“异常:StandardOut 尚未重定向或进程尚未开始”而崩溃。如果我更改顺序,它运行正常。
  • @Oleg 随时通过minimal reproducible example 提出新问题。
【解决方案2】:

Kill 要求 系统 毫不客气地终止进程(通过调用 Windows TerminateProcess 系统调用)。这类似于任务管理器中的结束进程。

Close 在 .NET 中关闭进程的句柄,但实际上并没有触及进程本身。 Close 也被 Dispose 调用。请参阅 Jon Skeet 的 this answer

第三个选项是CloseMainWindow,它确实通过要求关闭主窗口来优雅地关闭程序。这类似于右键单击任务栏上的程序并选择关闭。

【讨论】:

  • 当然,只有在应用程序设置为在其主窗口关闭时终止时,CloseMainWindow 才会终止应用程序。
【解决方案3】:

杀死和关闭不是两个选项。如果要终止进程,必须调用 Kill(或 CloseMainWindow)。调用 Close 只会释放资源,但不会关闭标准流。自己关闭流可能会也可能不会导致流程结束,这取决于流程。最好的策略是根据进程的类型调用 Kill 或 CloseMainWindow,然后 Dispose 进程对象。

Close 开始关闭 Process 对象。它由 Dispose 调用。 Close 一般用于管理 Process 对象的资源。

Kill 终止进程。这是终止没有用户界面的进程的唯一方法。

CloseMainWindow 向进程的主窗口发送关闭消息。这是停止具有用户界面的进程的优雅方式。

【讨论】:

    【解决方案4】:

    让我来说明一下当你调用 Close() 和 Kill() 时会发生什么。以下将打开记事本,但在 myProcess.Close() 执行时最后不会退出记事本。

    Process myProcess;
    myProcess = Process.Start("Notepad.exe");
    Thread.Sleep(10000);
    myProcess.Close();
    

    以下将打开记事本。 10 秒后记事本将在 myProcess.Kill() 执行时关闭。

    Process myProcess;
    myProcess = Process.Start("Notepad.exe");
    Thread.Sleep(10000);
    myProcess.Kill();
    

    【讨论】:

      【解决方案5】:

      Process.Kill 调用 TerminateProcess。

      Process.Close 不会做你认为它做的事!它只是释放类实例使用的资源。请阅读:http://msdn.microsoft.com/en-us/library/system.diagnostics.process.close.aspx

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-02-17
        • 1970-01-01
        • 2014-03-23
        • 1970-01-01
        • 2017-06-11
        相关资源
        最近更新 更多