【问题标题】:csharp cygwin can not kill mintty.execsharp cygwin 无法杀死 mintty.exe
【发布时间】:2017-04-05 11:46:31
【问题描述】:

我正在使用来自System.DiagnosticsProcess 类,这是我的代码:

public void doMain() {
    Process cygwin = new Process();
    cygwin.StartInfo.FileName = "C:\\cygwin64\\bin\\mintty.exe";
    cygwin.Start();
    cygwin.Refresh();
    Thread.Sleep(1000);
    cygwin.Kill();
    cygwin.WaitForExit();
}

通常这应该运行 mintty.exe 进程,然后等待 1 秒然后终止该进程,但它给我的错误是它在终止调用之前已关闭。

在线cygwin.Kill();调用出现这个异常:

System.dll 中出现“System.InvalidOperationException”类型的未处理异常
附加信息:无法处理请求,因为进程已退出。

为什么会这样?!
如果我用"C:\\cygwin64\\bin\\bash.exe" 替换"C:\\cygwin64\\bin\\mintty.exe",异常就会消失!
有什么问题?

【问题讨论】:

  • 如果您从file explorer 而不是在代码中运行mintty.exe,它会立即退出吗?我有一种感觉bash.exe在你加载它的时候为你提供了一个命令行实用程序,但是mintty没有这样的东西。
  • @JayGould 不!为什么它应该立即退出?我让我的代码等待1000 毫秒,然后终止该进程。好吧,mintty.exe 在某种程度上就像是 bash.exe 的包装器。
  • 首先,问问自己在执行 kill 方法期间该错误/异常意味着什么。当我读到它时, kill 失败了,因为您试图杀死的进程已经退出。在下面阅读我的答案。 Start 方法创建进程#p,该进程创建子进程#c。进程#p 退出。进程#c 打开 mintty 窗口。您尝试杀死进程#p,但它已经被杀死/退出。 cygwin 对象中的进程号是多少? mintty 的进程号是多少(提示:使用任务管理器)?
  • @DougHenderson 是的,他们是不同的,你的权利。
  • @DougHenderson 所以你认为有什么办法可以控制薄荷味的过程吗?

标签: c# process cygwin system.diagnostics


【解决方案1】:

您在终止进程后调用cygwin.WaitForExit(),因此出现错误。

将您的代码更新为:

public void doMain() {
    Process cygwin = new Process();
    cygwin.StartInfo.FileName = "C:\\cygwin64\\bin\\mintty.exe";
    cygwin.Start();
    cygwin.Refresh();
    Thread.Sleep(1000);
    cygwin.Kill();
    //cygwin.WaitForExit();
}

它应该可以工作。

【讨论】:

  • 在评论该行后不再工作。另请阅读msdn.microsoft.com/en-us/library/… 它说The Kill method executes asynchronously. After calling the Kill method, call the WaitForExit method to wait for the process to exit, or check the HasExited property to determine if the process has exited.
  • 错误发生在哪一行?您说“在此之后”,WaitForExit() 是否被调用?
  • 我认为它没有被调用。在我的意思是on 之后。
【解决方案2】:

这是启动 Windows 程序的简单方法,它独立于启动过程和方法。该程序立即分叉(启动一个新进程),并且该新子进程打开 mintty 窗口,而原始进程退出。这是为了防止你做你想做的事情。它在一个新的进程树中创建子进程。否则,如果你从 cmd 窗口运行程序,当你关闭 cmd 窗口时它会关闭。

【讨论】:

  • 我打开 cmd 并输入cd "c:/cygwin64/bin",然后输入mintty.exe cygwin 窗口打开,但是当我关闭 cmd 窗口时它没有关闭。除此之外,我认为所有Process 类所做的都是分叉,对吗?因为如果它使用了exec,我会看到我的winform(该代码是绑定到点击按钮点击方法的gui应用程序的一部分)被关闭,对吗?如果我错了,请纠正我。谢谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-08
  • 1970-01-01
  • 1970-01-01
  • 2019-08-24
  • 2016-06-22
相关资源
最近更新 更多