2009-11-10 4 views
4

Considérer un gestionnaire de signaux qui appelle exit() comme dernière instruction: est sûr d'appeler des fonctions non réentrantes (par exemple free()) dans ce gestionnaire?fonction non réentrante dans le gestionnaire de signal?

À mon humble avis, il serait légal en raison du fait que le gestionnaire ne retourne pas à la séquence d'exécution normale.

Merci d'avance.

Répondre

4

Non, c'est illégal, plus que cela, il y a très peu de fonctions sûres à appeler.

Il existe une liste de fonctions sûres à appeler, voir la section Notes http://linux.die.net/man/2/signal.

0

Réentrance comme plus à voir avec l ' « entrée » à une fonction et, les effets secondaires et de l'état maintenu par ladite fonction que la sortie ...

Vous pouvez consulter ce man page.

1

Vous devez distinguer deux signaux: ceux qui indiquent au démon de «recharger» et ceux qui terminent le démon («kill»). Dans le cas "kill", vous n'avez pas besoin de libérer quoi que ce soit. Votre processus va mourir, le système d'exploitation va nettoyer tout ce que vous avez alloué. Si vous utilisez la mémoire partagée, vous devez effectuer le nettoyage lorsque vous êtes redémarré. Ne faites rien dans le gestionnaire "kill" qui pourrait causer des problèmes. Meurs juste.

Dans le cas de rechargement, vous pouvez appeler n'importe quelle fonction car l'utilisateur souhaite que vous vous «arrêtiez en ordre». Dans ce cas, il y a peu de chances que vous receviez à nouveau le même signal (donc peu importe si une fonction est réentrante ou non).

+0

Ok, merci. Ce projet est pour un examen. J'étais inquiet de laisser un malloc() sans free() :) – Marco

+1

Incorrect. Si le signal a interrompu du code qui acquiert un verrou, puis que le gestionnaire de signal essaie d'acquérir le même verrou, votre programme va se bloquer. J'ai vu cela se produire une fois quand un signal interrompu free() et ensuite le gestionnaire de signal appelé free(). –

+0

@Posco Grubb: Intéressant; comment puis-je empêcher cela en C? Le signal SIGHUP peut arriver à tout moment. Comment puis-je m'assurer que je n'appelle pas des fonctions "dangereuses"? –

Questions connexes