2009-09-06 6 views
-1

je fais quelque chose comme ce qui suit:Pourquoi mon gestionnaire de signal HUP ne met-il pas à jour la variable globale en Perl?

J'exécuter un script Perl qui a les éléments suivants:

# First i install a signal handler for HUP which sets a global flag. 
$SIG{"HUP"} = sub { print "HUP received\n"; $received_hup = 1 }; 
# Now i wait for HUP to be received. 
my $cnt = 0; 
for ($cnt = 0; $received_hup != 1 and $cnt < 900; $cnt++) { 
    sleep(1); 
} 
print ($received_hup == 1) ? "true" : "false"; 

J'envoyer HUP à ce processus perl. Je trouve que quelquefois faux est imprimé bien que chaque "HUP reçu" soit également imprimé; , c'est-à-dire bien que le gestionnaire de signal soit appelé, la variable globale n'est pas modifiée.

Je ne suis pas familier avec les problèmes de concurrence en Perl, alors s'il vous plaît me guider avec cela.

Répondre

5

Eh bien, d'abord, ce ne est pas réellement possible pour votre programme pour imprimer « false », parce que vous manquez une paire de parenthèses dans l'impression:

print (($received_hup == 1) ? "true" : "false"); 

Sans cette paire supplémentaire, son analysé comme :

(print($received_hup == 1)) ? "true" : "false"; 

ce qui n'est clairement pas ce que vous voulez.

Ce programme de test - modifié avec les bonnes parenthèses - fonctionne très bien ici, sur Debian Linux w/perl 5.10. Je l'ai essayé plus de 100 fois et chaque fois il a imprimé "HUP reçu" et "vrai". Si ce programme de test exact ne fonctionne pas pour vous, je pense que vous avez juste une version boguée de perl. Les versions plus anciennes de Perl, avant 5.8 je crois, ont eu des problèmes de gestion du signal.

+4

Vous pourriez ajouter qu'il y aurait eu un avertissement si les avertissements avaient été activés. – ysth

Questions connexes