2017-04-05 3 views
0

ich mit der Process Klasse von System.Diagnostics arbeitete und hier ist mein Code:csharp Cygwin kann mintty.exe nicht töten

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(); 
} 

Normalerweise sollte dieser mintty.exe Prozess laufen und dann 1 Sekunde warten und dann diesen Prozess beenden, aber Es gibt mir den Fehler, dass es vor dem Kill-Aufruf geschlossen wurde.

Auf der Linie cygwin.Kill(); nennt diese Ausnahme auftritt:

Eine nicht behandelte Ausnahme des Typs ‚System.InvalidOperationException‘ in System.dll
Weitere Informationen aufgetreten: nicht Prozessanforderung kann, weil der Prozess beendet wird.

Warum passiert das ?!
Wenn ich die "C:\\cygwin64\\bin\\mintty.exe" durch "C:\\cygwin64\\bin\\bash.exe" ersetze, geht die Ausnahme weg!
Was ist das Problem?

+0

Wenn Sie 'mintty.exe' von' Datei-Explorer' statt im Code ausführen, wird es sofort beendet? Ich habe das Gefühl, dass 'bash.exe' Ihnen ein Kommandozeilen-Dienstprogramm zur Verfügung stellt, wenn Sie es laden, aber' mintty' hat keine solche Sache. –

+0

@JayGould Nein! warum sollte es sofort verlassen? Ich habe meinen Code auf 1000 Millisekunden warten lassen und dann den Prozess beendet. Nun, 'mintty.exe' ist irgendwie wie ein Wrapper für' bash.exe'. – newpeople

+0

Fragen Sie sich zunächst, was dieser Fehler/diese Ausnahme während der Ausführung der Kill-Methode bedeutet. Während ich es lese, scheitert Kill, weil der Prozess, den Sie zu töten versuchen, bereits beendet ist. Lies meine Antwort unten. Der Start-Prozess erzeugt den Prozess #p, der den untergeordneten Prozess #c erzeugt. Prozess #p wird beendet. Prozess #c öffnet das Pfefferminz-Fenster. Sie versuchen, den Prozess #p zu beenden, aber er ist bereits beendet. Wie lautet die Prozessnummer im Cygwin-Objekt? Was ist die Prozessnummer (n) von minty (Hinweis: Task-Manager verwenden)? –

Antwort

0

Sie rufen cygwin.WaitForExit() nach dem bereits den Prozess, daher der Fehler.

aktualisieren Sie Ihren Code:

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(); 
} 

und es sollte funktionieren.

+0

Funktioniert nicht mehr, nachdem diese Zeile kommentiert wurde. Lesen Sie auch https://msdn.microsoft.com/en-us/library/system.diagnostics.process.kill(v=vs.110).aspx Es heißt 'Die Kill-Methode wird asynchron ausgeführt. Rufen Sie nach dem Aufruf der Kill-Methode die WaitForExit-Methode auf, um den Prozess zu beenden oder überprüfen Sie die HasExited-Eigenschaft, um festzustellen, ob der Prozess beendet wurde. – newpeople

+0

In welcher Zeile tritt der Fehler auf? Sie sagen "danach", wird 'WaitForExit()' aufgerufen oder nicht? –

+0

Ich denke, es wird nicht aufgerufen. bis ich "auf" der Linie meinte. – newpeople

0

Dies ist die einfache Methode, ein Windows-Programm zu starten, das unabhängig vom Startprozess und der Methode ist. Das Programm verzweigt sofort (startet einen neuen Prozess), und dieses neue Kind öffnet das Pfefferminz-Fenster, während der ursprüngliche Prozess beendet wird. Dies soll verhindern, dass Sie das tun, was Sie tun möchten. Es erstellt das Kind in einem neuen Prozessbaum. Andernfalls, wenn Sie das Programm von einem cmd-Fenster aus ausführen, wird es geschlossen, wenn Sie das cmd-Fenster schließen.

+0

Ich öffnete cmd und gab 'cd" ein c:/cygwin64/bin "' gefolgt von 'mintty.exe' das cygwin-Fenster öffnet sich, aber es wird nicht geschlossen, wenn ich das cmd-Fenster schließe. Abgesehen davon denke ich, dass all diese "Prozess" -Klasse richtig ist? Wenn ich 'exec' benutzt habe, würde ich meine winform sehen (dieser Code war Teil einer GUI-App, die an die Klickmethode geklickt hat), um geschlossen zu werden, stimmt's? korrigiere mich bitte wenn ich falsch liege. Vielen Dank :) – newpeople