Question

Linux prend en charge l'envoi d'un signal Posix arbitraire tel que SIGINT ou SIGTERM à un processus utilisant le kill-Commande.Alors que SIGINT et SIGTERM ne sont que de vieilles façons ennuyeuses de terminer un processus de manière amicale ou pas si amicale, SIGQUIT est destiné à déclencher un core dump.Cela peut être utilisé pour déclencher une machine virtuelle Java en cours d'exécution afin d'imprimer un vidage de thread, y compris les traces de pile de tous les threads en cours d'exécution -- parfait !Après avoir imprimé les informations de débogage, la machine virtuelle Java continuera à faire ce qu'elle faisait auparavant ;en fait, le vidage du thread se produit simplement dans un autre thread généré de priorité maximale.(Vous pouvez essayer vous-même en utilisant kill -3 <VM-PID>.)

Notez que vous pouvez également enregistrer vos propres gestionnaires de signaux en utilisant le (non pris en charge !) Signal et SignalHandler cours dans le sun.misc-package, pour que vous puissiez vous amuser avec toutes sortes de choses.

Cependant, je n'ai pas encore trouvé de moyen d'envoyer un signal à un processus Windows. Les signaux sont créés par certaines entrées utilisateur : Ctrl-C déclenche un SIGINT sur les deux plateformes, par exemple.Mais il ne semble pas y avoir d'utilitaire permettant d'envoyer manuellement un signal à un processus en cours d'exécution mais non interactif sous Windows.La solution évidente est d'utiliser Cygwin kill exécutable, mais bien qu'il puisse mettre fin aux processus Windows à l'aide de l'API Windows appropriée, je n'ai pas pu envoyer de message SIGBREAK (l'équivalent Windows de SIGQUIT) avec ça;en fait, je pense que le seul signal qu'il est capable d'envoyer aux processus Windows est SIGTERM.

Donc, pour faire court et répéter le titre :Comment envoyer un signal arbitraire à un processus sous Windows ?

Était-ce utile?

La solution

Si vous voulez tuer explicitement / par programme un autre programme / processus de quelque type que ce soit, dans les pstools des SysInternals, vous trouverez un petit outil nommé & "; pskill &"; qui se comporte exactement comme Unixen & "tuer &"; ferait.

Si vous voulez autre chose, continuez à lire (même si je me trompe peut-être sur certaines des particularités ci-dessous - cela fait bien longtemps que j'ai développé un programme Windows en C utilisant uniquement l'excellent livre WinAPI et Charles Petzold & ";" Programmation pour Windows & "; Comme guide).

Sous Windows, vous n'avez pas correctement les & signaux & "; quelles fonctions WinMain et WinProc reçoivent du système d'exploitation sont de simples messages . Par exemple, lorsque vous cliquez sur & Quot; X & Quot; bouton d’une fenêtre, Windows envoie le message WM_CLOSE au gestionnaire de cette fenêtre. Lorsque la fenêtre est supprimée mais que le programme est toujours en cours d'exécution, il envoie WM_DESTROY. Lorsqu'il est sur le point de sortir de la boucle de traitement de messages principale, WinMain (et non WinProc) reçoit WM_QUIT. Votre programme doit répondre à toutes ces attentes comme prévu - vous pouvez en fait développer un & "; Inclable "; en ne faisant pas ce qu’il devrait après avoir reçu un WM_CLOSE.

Lorsque l'utilisateur sélectionne la tâche dans le Gestionnaire des tâches Windows et clique sur & "Terminer la tâche &", le système d'exploitation envoie WM_CLOSE (et un autre dont je ne me souviens plus). Si vous utilisez & "Terminer le processus &", Le processus est tué directement, aucun message n’a jamais été envoyé (source: L'ancienne nouvelle chose

Je me souviens qu'il y avait un moyen d'obtenir le HWND d'une fenêtre de processus, une fois qu'un autre processus pourrait envoyer à cette fenêtre un message via les fonctions PostMessage et DispatchMessage.

Autres conseils

Windows n'est pas POSIX. Il n'a pas de signaux. Les seuls signaux que les programmes de console obtiennent sont s'ils appellent SetConsoleCtrlHandler. Dans ce cas, il peut être averti que l'utilisateur a appuyé sur les touches Ctrl + C, Ctrl + Break, a fermé la fenêtre de la console, a fermé la session ou a fermé le système. .

Tout le reste est fait avec IPC, généralement avec des messages de fenêtre ou RPC. Consultez la documentation de Sun pour voir s’il est possible de faire ce que vous demandez sur le JRE Windows.

Sous Windows, tout tourne autour des messages Win32. Je ne crois pas qu'il existe un outil de ligne de commande pour le faire, mais en C ++, vous pouvez utiliser FindWindow pour envoyer un message arbitraire à un autre programme Windows. par exemple:

#define WM_MYMSG  ( WM_USER+0x100 )
HWND h = ::FindWindow(NULL,_T("Win32App"));
if (h) {
    ::PostMessage(h, WM_MYMSG, 0, 0);
}

Cela peut également être fait en C # en utilisant com interop.

Vous pouvez également utiliser jconsole pour afficher le stacktrace de tous les threads en cours d'exécution. Cela fonctionnera sous Windows et sous tout autre système d'exploitation prenant en charge Java. jconsole a aussi beaucoup d’autres fonctionnalités intéressantes, des graphiques de mémoire, des graphiques de processeur, etc.

Cela ne répond pas à votre question initiale, mais vous permet, espérons-le, d'obtenir les mêmes résultats.

Si vous n'êtes pas familier avec jconsole, consultez la Utilisation de la documentation JConsole .

Je me demande simplement si le PsTools à partir de, maintenant SysInternals , appartenant à Microsoft, pourrait vous aider.

Ruby est en quelque sorte capable (au moins d'émuler) SIGINT SIGKILL etc.sur Windows et interceptez ces messages.Je voudrais peut-être vérifier.

Comment Ruby "envoie le signal SIGINT à ce processus" en dessous, dans Windows, consiste en fait à appeler TerminateProcess ou équivalent sur ce PID.

Il existe également une méthode équivalente à Windows pour "attraper ctrl+c". J'imagine que c'est ce qu'elle appelle ici.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top