2017-04-05 38 views
0

我与来自System.DiagnosticsProcess类工作,这里是我的代码: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",例外情况就会消失!
问题是什么?

+0

如果您从'文件资源管理器'而不是代码运行'mintty.exe',它会立即退出吗?我有一种感觉,'bash.exe'提供给你一个命令行实用程序,但是'mintty'没有这样的东西。 –

+0

@JayGould不!为什么它应该立即退出?我让我的代码等待了1000毫秒,然后终止了这个过程。那么'mintty.exe'就像是'bash.exe'的包装器。 – newpeople

+0

首先,问自己在执行kill方法期间,错误/异常意味着什么。当我读到它时,杀死失败了,因为你试图杀死的进程已经退出。在下面阅读我的答案。启动方法创建进程#p,分叉创建子进程#c。进程#p退出。进程#c打开薄荷窗口。您尝试杀死进程#p,但它已被杀死/退出。 cygwin对象中的进程号是什么?什么是mintty的进程号(提示:使用任务管理器)? –

回答

0

您在致电进程后致电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(); 
} 

,它应该工作。

+0

评论该行后不再工作。另请阅读https://msdn.microsoft.com/en-us/library/system.diagnostics.process.kill(v=vs.110).aspx它说“杀死方法异步执行。调用Kill方法后,调用WaitForExit方法等待进程退出,或者检查HasExited属性以确定进程是否已退出。 – newpeople

+0

哪条线出错?你说“在这之后”,WaitForExit()是否被调用? –

+0

我认为它不会被调用。之后我的意思是在线上。 – newpeople

0

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

+0

我打开了cmd并输入'cd“c:/ cygwin64/bin”'后跟'mintty.exe',打开了cygwin窗口,但是当我关闭cmd窗口时它并未关闭。除此之外,我认为所有那些'Process'类都是正确的?因为如果它使用了'exec'我会看到我的winform(该代码是gui应用程序的一部分,它会绑定点击按钮的方法)会被关闭,是真的吗?请纠正我,如果我错了。谢谢 :) – newpeople