2017-07-15 2 views
3

Ich arbeite an einer Anwendung, die Powershell-Skripts zum Einrichten und Starten von Dienstprozessen (nicht formale Windows-Dienste) startet. Ich möchte ctrl + c Signale an diese Powershell-Prozesse und ihre untergeordneten Prozesse senden können, um sie sauber herunterzufahren.windows ctrl + c Signale nicht feuern

Wenn ich erstellen Sie den Powershell-Prozess I CREATE_NEW_PROCESS_GROUP gesetzt, die SetConsoleCtrlHandler(NULL,TRUE) implizit aufruft, die abschaltet effektiv ctrl +c für den erstellten Prozess und seine Kinder. Ich kann nicht verwenden ctrl + brechen weil dies Powershell in den Debug-Modus versetzt. So in der Powershell-Prozess, den ich starten, nenne ich SetConsoleCtrlHandler(NULL,FALSE)ctrl + c wieder einzuschalten und meine Anwendung haben, dann ruft GenerateConsoleCtrlEventctrl + c Ereignisse Power der Prozessgruppe zu senden, wenn ich diesen Prozess stoppen wollen Baum. Das funktioniert perfekt, aber mit einem großen Fehler.

Wenn ich Typ ctrl + c in der Konsole manuall wo meine Anwendung ausgeführt wird, meine Anwendung fängt den ctrl + c und ruft dann GenerateConsoleCtrlEvent für jeden Powershell-Prozess. Dies scheint gut, aber nur das erste Mal zu funktionieren.

Nach meiner Anwendung beendet es scheint ctrl +c nun für jedes Programm i in dieser Konsole laufen ausgeschaltet. Wenn ich PING oder meine eigene Anwendung, ctrl + c mache, tut nichts und ich bin nicht sicher, wie man weiter debuggt.

Interessanterweise sehe ich manchmal Griffe in Process Explorer zu den toten Powershell-Prozessen in conhost.exe. Wenn ich diese Handles im Process Explorer schließe, kommt SOMETIMES ctrl + c zurück. Ich vermute also, dass ein Handle-Leakage vorliegt, aber diese Beobachtung ist nicht konsistent und ich bin vorsichtig, meine Prozess-Handles in meiner Anwendung freizugeben.

Irgendwelche Gedanken auf, was meine Konsole kann geschluckt ctrl +c Signale zu verursachen?

+0

Alles nach 'UPDATE' sollte ausgeschnitten und als Antwort gepostet werden. Ja, Sie dürfen Ihre eigenen Fragen beantworten. Nein, wir werden nicht weniger von dir denken, wenn du das tust; Nein, Antworten sollten * nicht * in Fragen eingebettet sein. –

+0

Das ist fair @ JeroenMostert. Ich glaube, es war nicht wirklich die Antwort, die ich hören wollte, aber wahrscheinlich die beste Antwort, die ich bekommen werde :) –

+0

Sie sind frei, Ihre eigene Antwort nicht zu akzeptieren, wenn Sie es nicht als zufriedenstellend betrachten. :-) Bounties sind eine weitere Möglichkeit, Aufmerksamkeit zu erregen. –

Antwort

1

Es scheint, dass GenerateConsoleCtrlEvent nach einem vom Benutzer Brennen Abfrage aufgerufen + c ist, was die Shell in diesen seltsamen Zustand versetzt. Wenn der Benutzer ctrl + c eingibt, ist es für meine Anwendung wirklich nicht erforderlich, GenerateConsoleCtrlEvent aufzurufen, da das GenerateConsoleCtrlEvent zu jedem Prozess in der Konsole sendet. Leider meine App GenerateConsoleCtrlEvent, wenn es abfängt ctrl + c ist einfacher gesagt als getan, aber nicht unmöglich.

Beunruhigend, dass ich keine Unterlagen oder Informationen gefunden haben, die besagt, dass + c hat diese seltsame Wirkung GenerateConsoleCtrlEvent nach einem typisierten ctrl Brennen aber vielleicht wird dieser Beitrag jemand anderes helfen.

Wenn jemand detailliertere Informationen darüber erhält, warum dieser Status ausgelöst wird, oder Tipps zu anderen Möglichkeiten, dies zu vermeiden und die Shell widerstandsfähiger gegen GenerateConsoleCtrlEvent zu machen, veröffentlichen Sie hier bitte eine andere Antwort.