2011-09-14 1 views
0

Je cours un programme Perl, il y a un module dans le programme qui est déclenché par un processus externe pour tuer tous les processus enfants et terminer son exécution. Cela fonctionne très bien. Mais, quand une certaine fonction dit xyz() est en cours d'exécution, il y a une instruction sleep(60) sur une condition.

À l'heure actuelle, la fonction est exécutée de façon répétée car elle attend une certaine valeur.

Lorsque je déclenche le processus d'arrêt comme mentionné ci-dessus, le processus n'a pas lieu.

Quelqu'un at-il une idée de la raison pour laquelle cela se produit?

+2

La question est un peu déroutante. Essayez-vous de tuer le processus parent ou le processus enfant? après le forking, les deux processus ont leur propre espace d'adressage et ne dépendent pas l'un de l'autre sauf si vous utilisez un IPC. S'il vous plaît RE-REPOSEZ VOTRE QUESTION. – Arunmu

+1

Pourquoi est-ce marqué "proc"? Est-ce l'un des sens énumérés dans http://meta.stackexchange.com/questions/107791/how-should-the-proc-tag-be-split-up –

Répondre

0

Je ne comprends pas comment vous essayez de tuer un processus de l'intérieur de lui-même (votre $$ dans le sujet de la question) quand il dort.

Si vous tuez d'un processus DIFFÉRENT, alors il aura son propre $$. Vous devez trouver le PID du processus original à tuer en premier (en traçant la liste des processus ou en le communiquant d'une manière ou d'une autre à partir du processus original).

Tuer un processus de couchage fonctionne très bien

$ (date ; perl5.8 -e 'sleep(100);' ; date) & 

    Wed Sep 14 09:48:29 EDT 2011 

$ kill -KILL 8897 

    Wed Sep 14 09:48:54 EDT 2011 

Cela fonctionne aussi avec d'autres signaux "killish" ('INT', 'ABRT', 'QUIT', 'TERM')


MISE À JOUR: Lors de la relecture, le problème que vous avez mentionné était que la partie "déclenchée par un processus externe" ne se produisait pas. Si tel est le cas, vous devez:

  • Mettre en place un gestionnaire de signal capturable dans votre processus avant d'aller dormir ($SIG{'INT'}) - SIGKILL ne peut pas être pris par un gestionnaire.

  • Envoyer SIGINT dudit « processus externe »

  • Est-ce que tout le nettoyage nécessaire une fois que le sommeil() est interrompue par SIGINT du gestionnaire de SIGINT.

Questions connexes