Commande Trap sous UNIX

Comment fonctionne la commande trap dans ce code?

trap "ignore" 2 ignore() { main } main() { trap "main" 2 while [ 1 ] do echo -e "\t\t\t1.Add\n\t\t\t2.Remove\n\t\t\t3.Edit\n\t\t\t4.Search\n\t\t\t5.Display\n\t\t\t6.Exit" echo "Enter the option" read option case $option in 1)echo "You take add option";; 2)echo "You take Remove option";; 3)echo "You take Edit option";; 4)echo "You take Search option";; 5)echo "You take Display option";; 6)exit;; *)echo "Invalid Option" esac done } main 

Si le script ci-dessus est exécuté, le signal ctrl + c est intercepté et la fonction principale est appelée. Mais, c’est fait seulement le temps (première fois). Cela ne fonctionne pas dans la seconde fois. A la première utilisation de ctrl + c, main sera appelée. Mais cela ne fonctionne qu’une fois. A la deuxième fois du ctrl + c, main ne sera pas exécuté.

C’est comme ça que les signaux fonctionnent sous UNIX. Lorsque vous envoyez un SIGINT en appuyant sur Ctrl + C , le gestionnaire de signaux est appelé, dans votre cas, la fonction main . Mais lorsque le gestionnaire traite le signal, tous les signaux suivants sont bloqués jusqu’à ce que le gestionnaire revienne. Dans votre cas, le gestionnaire ne revient jamais. Ainsi, votre programme ne peut pas réagir aux signaux SIGINT suivants tant que le gestionnaire ne revient pas. Ce n’est pas une bonne idée d’appeler un gestionnaire de signal de manière récursive et un gestionnaire de signal ne devrait pas non plus trop travailler. Il devrait traiter le signal et revenir dès que possible.

Notez également que les noms de macro définis, tels que SIGINT doivent être utilisés pour une meilleure portabilité que les nombres réels. Vous pouvez obtenir la liste en utilisant les commandes kill -l ou trap -l .