2010-07-06 5 views
0

j'ai trouvé un scénario bizarre où si je commence un programme java et je veux sortir avec grâce CTRL +C il ne fonctionne pas/répondre, je dois faire un CTRL + Z sur le programme et ce n'est pas cool, faire un ps répertorie le processus ... Tout le monde s'il vous plaît.CTRL-C ne fonctionne pas sur Java programme

+0

Pouvez-vous écrire un code? –

Répondre

3

Sous Unix, les programmes de ligne de commande ont un grand contrôle sur ce qui se passe lorsque vous essayez de les interrompre avec ^C. L'effet par défaut de taper ^C sur un terminal est de faire en sorte que le noyau envoie le signal SIGINT au groupe de processus de premier plan, et le comportement par défaut de SIGINT est de tuer le processus auquel il est envoyé, mais ces deux éléments peuvent être modifiés. La cause la plus probable de votre problème est que votre programme Java intercepte SIGINT afin de faire un peu de nettoyage avant de quitter, mais le gestionnaire de signal est buggé pour que le processus ne sorte jamais réellement. La deuxième cause la plus probable est que le programme est en ignorant complètementSIGINT. Et la cause la moins probable est qu'il met le terminal en "mode brut" de sorte que ^C délivre juste un octet avec la valeur 0x03 à son entrée standard (s'il avait fait que ^Z ne fonctionnerait probablement pas non plus).

Si vous avez accès au code source de votre programme, vous pouvez essayer de corriger le gestionnaire de signal buggé et/ou le faire cesser d'ignorer le signal. Sinon, vous êtes un peu un ruisseau. Vous pouvez essayer ^\ (control-backslash), qui envoie un différent signal normalement létale (SIGQUIT), mais cela ne fonctionne pas non plus, et si cela fonctionne, il peut vous laisser avec un gigantesque "core dump" fichier à se débarrasser de.

Le seul moyen sûr à 100% de se débarrasser d'un processus de dysfonctionnement est de lui envoyer le signal 9 (SIGKILL). Contrairement aux autres signaux létaux, il est impossible d'intercepter, bloquer ou ignorer celui-ci. Il n'y a pas de clé de contrôle pour envoyer le signal 9; vous devez suspendre le processus avec ^Z, ou ouvrir une nouvelle session de fenêtre de terminal/ssh, trouver l'ID de processus avec ps et utiliser la commande kill. Essayez toujours kill PID avant kill -9 PID.