CSHARP的cygwin不能杀mintty.exe
我与来自System.Diagnostics
的Process
类工作,这里是我的代码:CSHARP的cygwin不能杀mintty.exe
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.InvalidOperationException”类型的未处理的异常出现在System.dll中
其他信息:无法处理请求,因为该进程已退出。
为什么会发生这种情况?
如果我将替换为"C:\\cygwin64\\bin\\bash.exe"
,例外情况就会消失!
问题是什么?
您在致电进程后致电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();
}
,它应该工作。
这是启动一个独立于启动过程和方法的Windows程序的简单方法。程序立即分叉(开始一个新进程),并且新的子进程打开了mintty窗口,而原始进程退出。这是为了防止你做你想做的事情。它在新的进程树中创建子进程。否则,如果您从cmd窗口运行程序,它将在您关闭cmd窗口时关闭。
我打开了cmd并输入'cd“c:/ cygwin64/bin”'后跟'mintty.exe',打开了cygwin窗口,但是当我关闭cmd窗口时它并未关闭。除此之外,我认为所有那些'Process'类都是正确的?因为如果它使用了'exec'我会看到我的winform(该代码是gui应用程序的一部分,它会绑定点击按钮的方法)会被关闭,是真的吗?请纠正我,如果我错了。谢谢 :) – newpeople
如果您从'文件资源管理器'而不是代码运行'mintty.exe',它会立即退出吗?我有一种感觉,'bash.exe'提供给你一个命令行实用程序,但是'mintty'没有这样的东西。 –
@JayGould不!为什么它应该立即退出?我让我的代码等待了1000毫秒,然后终止了这个过程。那么'mintty.exe'就像是'bash.exe'的包装器。 – newpeople
首先,问自己在执行kill方法期间,错误/异常意味着什么。当我读到它时,杀死失败了,因为你试图杀死的进程已经退出。在下面阅读我的答案。启动方法创建进程#p,分叉创建子进程#c。进程#p退出。进程#c打开薄荷窗口。您尝试杀死进程#p,但它已被杀死/退出。 cygwin对象中的进程号是什么?什么是mintty的进程号(提示:使用任务管理器)? –