Ein beliebiges Signal in Windows senden?
Frage
Linux unterstützt das Senden eines beliebigen Posix-Signals wie z SIGINT
oder SIGTERM
zu einem Prozess, der die verwendet kill
-Befehl.Während SIGINT
Und SIGTERM
sind nur langweilige alte Methoden, um einen Prozess auf eine freundliche oder weniger freundliche Art und Weise zu beenden. SIGQUIT
soll einen Core-Dump auslösen.Dies kann verwendet werden, um eine laufende Java-VM dazu zu veranlassen, einen Thread-Dump auszudrucken, einschließlich der Stacktraces aller laufenden Threads – nett!Nach dem Drucken der Debugging-Informationen macht die Java VM weiterhin mit dem, was sie zuvor getan hat.Tatsächlich geschieht der Thread-Dump einfach in einem anderen erzeugten Thread mit maximaler Priorität.(Sie können dies selbst ausprobieren, indem Sie verwenden kill -3 <VM-PID>
.)
Beachten Sie, dass Sie auch Ihre eigenen Signalhandler mithilfe des (nicht unterstützten!) Registrierens registrieren können. Signal
Und SignalHandler
Klassen in der sun.misc
-Paket, damit Sie jede Menge Spaß damit haben können.
Ich habe jedoch noch keine Möglichkeit gefunden, ein Signal an einen Windows-Prozess zu senden. Signale werden durch bestimmte Benutzereingaben erzeugt: Ctrl-C
löst ein aus SIGINT
zum Beispiel auf beiden Plattformen.Aber es scheint kein Dienstprogramm zu geben, um manuell ein Signal an einen laufenden, aber nicht interaktiven Prozess unter Windows zu senden.Die offensichtliche Lösung ist die Verwendung von Cygwin kill
ausführbare Datei, aber obwohl sie Windows-Prozesse mithilfe der entsprechenden Windows-API beenden kann, konnte ich keine senden SIGBREAK
(das Windows-Äquivalent zu SIGQUIT
) damit;Tatsächlich denke ich, dass das einzige Signal, das es an Windows-Prozesse senden kann, Folgendes ist SIGTERM
.
Um es kurz zu machen und die Überschrift zu wiederholen:Wie sende ich ein beliebiges Signal an einen Prozess in Windows?
Lösung
Wenn das, was Sie wollen, ist explizit / programmaticly ein anderes Programm / Prozess jeglicher Art zu töten, innerhalb der SysInternals' pstools gibt es ein kleines Tool namens ‚pskill‘, die genau wie Unixen verhält ‚kill‘ tun würde.
Wenn Sie etwas anderes wollen, lesen (obwohl ich unten auf einige der Besonderheiten falsch sein kann - es ist schon Ewigkeiten her, dass ich ein Windows-Programm in C entwickelt unter Verwendung von nur der WinAPI und Charles Petzolds ausgezeichnete Bücher „Programming for Windows“ als Leitfaden).
Unter Windows Sie nicht richtig „Signale“ haben, welche Funktionen WinMain und WinProc vom Betriebssystem erhalten sind einfach Nachrichten . Zum Beispiel, wenn Sie auf die Schaltfläche „X“ eines Fensters klicken, sendet Fenster zum Fenster Handler die Nachricht WM_CLOSE. Wenn das Fenster des gelöschten aber Programm noch läuft, sendet er WM_DESTROY. Wenn es um ist aus der Nachrichtenverarbeitungsschleife zu erhalten, WinMain (nicht WinProc) empfängt WM_QUIT. Ihr Programm sollte auf alle diese reagiert wie erwartet -. Sie können tatsächlich eine „nicht verschließbare“ Anwendung entwickeln, indem sie nicht das tun, was es soll eine WM_CLOSE beim Empfang
Wenn der Benutzer die Aufgabe, aus dem Windows Task-Manager auswählt und klickt auf „Task beenden“, wird die OS senden WM_CLOSE (und ein anderes Ich kann mich nicht erinnern). Wenn Sie auf „Prozess beenden“ verwenden, obwohl, wird der Prozess direkt getötet, schickte keine Nachrichten jemals (Quelle: The Old New Thing
Ich erinnere mich, es war ein Weg, das HWND eines anderen Prozesses Fenster zu bekommen, sobald man sich, dass ein anderer Prozess, das Fenster eine Mitteilung durch Funktionen Postmessage und Dispatch senden könnte.
Andere Tipps
Windows ist kein POSIX.Es gibt keine Signale.Die einzigen „Signale“, die Konsolenprogramme erhalten, sind Aufrufe SetConsoleCtrlHandler
, In diesem Fall kann benachrichtigt werden, dass der Benutzer Strg+C, Strg+Untbr gedrückt, das Konsolenfenster geschlossen, sich abgemeldet oder das System heruntergefahren hat.
Alles andere wird mit IPC erledigt, typischerweise mit Fensternachrichten oder RPC.Sehen Sie in der Dokumentation von Sun nach, ob es eine Möglichkeit gibt, das zu tun, was Sie in der Windows-JRE verlangen.
In Windows dreht sich alles um Win32-Nachrichten. Ich glaube nicht, es ist ein Kommandozeilen-Tool, dies zu tun, aber in C ++ können Sie verwenden
Sie können auch die Stacktrace aller laufenden Threads anzuzeigen verwenden jconsole. Dies wird unter Windows arbeiten, und jedem anderen Betriebssystem, das Java unterstützt. jconsole hat auch viele andere nette Features, Speicher Graphen, CPU Graphen etc. Es ist nicht die Antwort auf Ihre ursprüngliche Frage, aber hoffentlich können Sie die gleichen Ergebnisse erhalten. Wenn Ihr nicht vertraut mit jconsole Besuche die Mit JConsole Dokumentation.
Ich frage mich nur, wenn die PsTools aus, jetzt Microsoft, SysInternals würde Ihnen helfen.
Ruby ist irgendwie in der Lage zu (zumindest zu emulieren) SIGINT SIGKILL usw. auf Fenster, und Trap diese Nachrichten. wollen könnte es überprüfen.
Wie Rubin ist unter „Signal SIGINT zu diesem Prozess senden“, in den Fenstern, ist eigentlich TerminateProcess
oder gleichwertigem auf dieser PID zu nennen.
Es gibt auch ein Fenster gleichwertiges Verfahren für „Fang ctrl + c“ Ich stelle mir vor, es ist, was es dort nennt.