2010-01-05 4 views
4

J'ai un démon de console qui est exécuté par une application graphique. Lorsque l'application GUI est terminée, j'aimerais arrêter le démon.Existe-t-il une alternative POSIX SIGTERM sous Windows? - (Un arrêt en douceur pour l'application console)

Comment puis-je le faire doucement sur les fenêtres?

Sur Linux, j'utiliserais simplement SIGTERM existe-t-il un mécanisme similaire sur Windows pour les applications console? Pour fournir un peu plus de détails, l'application du démon est écrite en python et le code source est écrit en C# &.

Répondre

1

Define « douce » :)

Je suppose qu'il existe déjà un mécanisme de communication entre le démon et l'interface graphique. Il suffit d'introduire une commande "quitter" et de l'envoyer.

Si vous voulez supprimer le démon même s'il est occupé à faire quelque chose (ou est gelé), utilisez TerminateProcess(). Pour avoir le meilleur des deux, vous pouvez envoyer "quitter", puis attendre sur la poignée de processus pendant un certain temps (WaitForSingleObject()). Si le processus du démon ne meurt pas, disons 5 sec, alors terminez-le.

Si le thread principal du démon est sujet à de longues périodes d'activité, demandez au démon de démarrer un thread d'arrière-plan qui ne fait rien mais attend un événement nommé. Pour signaler ce thread, ouvrez l'événement par son nom depuis l'interface graphique, puis relevez-le. Il appartient au démon de savoir quoi faire lors de la détection d'un événement, mais au moins, il s'agira d'un arrêt contrôlé.

+0

Je n'ai aucune communication bidirectionnelle implémentée. J'utilise simplement stdout. C'est pourquoi j'ai posé la question :) –

+0

Eh bien, la réponse courte est qu'il n'y a pas de signaux, mais beaucoup d'autres mécanismes de communication interprocessus. Mais la plupart d'entre eux nécessitent une coopération aux deux extrémités. Celui qui ne le fait pas est TerminateProcess(). –

+0

J'ai finalement créé une mémoire partagée nommée et l'ai utilisée comme un moyen de communiquer avec l'interface graphique. –

1

Windows n'a pas de signaux comme vous le pensez.

Il existe une infrastructure permettant de modifier la façon dont le SIGTERM et le SIGBREAK (falsifiés) sont gérés par les applications de la console, principalement SetConsoleCtrlHandler et GenerateConsoleCtrlEvent mais les deux ne sont utilisables que dans l'application console elle-même; pas de l'extérieur.

Il convient de noter que toutes une application console Windows fait quand il reçoit un appel SIGTERM est ExitProcess, rien de spécial. Je ne suis pas à 100% sur ce que l'équivalent python est appelé, mais quel que soit l'appel "exit" standard, il devrait être équivalent.

Je suggérerais d'écrire du code pour signaler l'application de la console, l'obligeant à appeler ExitProcess lui-même. Si ce n'est pas une option, utilisez TerminateProcess (équivalent Process.Kill) pour fermer le processus de la console de l'extérieur; tenter de "simuler" un ExitProcess est dangereux pour les raisons indiquées dans l'article MSDN.

+0

GenerateConsoleCtrlEvent() doit fonctionner en dehors du processus. Passez le PID. –

+0

Je glisse sur les choses un peu, mais dwProcessGroupId! = PID dans le sens le plus pur. –

+0

CtrlEvent ressemble à la solution laissez-moi l'essayer. –