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).
Ok, merci. Ce projet est pour un examen. J'étais inquiet de laisser un malloc() sans free() :) – Marco
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(). –
@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"? –