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?

War es hilfreich?

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.

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top