2010-06-21 4 views
1

J'ai un script Perl avec le code suivant.Pourquoi est-ce que je reçois un code de retour inattendu?

... 
$kill = 1; 
$exit = 0; 
`kill -9 $pid >& /dev/null`; 
... 
print "kill=$kill exit=$exit\n"; 
if ($kill) { 
    exit $exit; 
} else { 
... 

En résumé, ce script utilise open3() pour exécuter une commande. À un certain point, il tue le travail et l'intention est que le script se termine avec le code 0. J'ai inséré une instruction d'impression pour montrer les valeurs des variables $kill et $exit, qui est montrée ci-dessous.

kill=1 exit=0 

Depuis $kill est 1, j'attendre le script pour sortir avec le code 0 ci-dessus, puisque $exit est 0. Cependant, le script sort avec le code 9, qui est le signal envoyé à l'enfant. Pourquoi le script Perl se ferme-t-il avec le code de sortie de l'enfant, au lieu de celui qui est donné à l'appel exit()?

+4

Orthogonale, mais ce n'est pas une bonne idée d'utiliser -9 en tant qu'argument 'kill' sauf dans le pire des cas d'urgence. Vous refusez au processus le droit d'effectuer les tâches de nettoyage qui pourraient être nécessaires. – Ether

+1

Quelle est la valeur de $ pid? –

Répondre

0

De here:

La fonction exit() ne sort pas toujours immédiatement. Il appelle d'abord toutes les routines END définies, mais ces routines END ne peuvent pas elles-mêmes annuler la sortie. De même, tous les destructeurs d'objets qui doivent être appelés sont appelés avant la sortie réelle.

+0

Alors, comment puis-je sortir avec le code désiré, tout en tuant l'enfant? – dromodel

+0

Non pertinent. Parce qu'il envoie 'SIGKILL' (' kill -9'), le processus Perl est terminé de force par le noyau et n'est pas autorisé à exécuter ** n'importe quel code d'arrêt ou de nettoyage. 'exit' n'est même pas appelé - dès que ce' SIGKILL' frappe, tout est fini avant que le code Perl ne sache ce qui l'a frappé. –

Questions connexes