2017-04-05 61 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