Vous ne pouvez pas croire que chaque signal envoyé sera délivré. Par exemple, le noyau linux "fusionne" SIGCHLD si un processus met longtemps à gérer SIGCHLD à partir d'un processus enfant quitté.
Pour répondre à une autre partie de votre question, les signaux sont "mis en file d'attente" à l'intérieur du noyau si un certain nombre de signaux différents arrivent dans un intervalle trop court.
Vous devez utiliser sigaction()
pour configurer le gestionnaire de signal avec le sa_sigaction
membre de siginfo_t
, en définissant soigneusement le sa_mask
membre de l' siginfo_t
argument. Je pense que cela signifie masquer tous les signaux "asynchrone" au moins. Selon la page de manuel pour Linux sigaction()
, vous masquerez également le signal traité. Je pense que vous devriez définir le sa_flags
membre sur SA_SIGINFO, mais je ne me souviens pas pourquoi j'ai cette superstition. Je crois que cela donnera à votre processus un gestionnaire de signaux qui reste défini sans conditions de concurrence et qui ne sera pas interrompu par la plupart des autres signaux.
Écrivez votre fonction de gestionnaire de signaux très, très soigneusement. Fondamentalement, il suffit de définir une variable globale pour indiquer qu'un signal a été capturé et que le reste du processus gère l'action souhaitée pour ce signal. Les signaux seront masqués pendant le moins de temps possible.
De plus, vous voudrez tester votre code de gestion du signal de manière très approfondie. Mettez-le dans un petit processus de test et envoyez autant de signaux SIGUSR1 et SIGUSR2 que possible, peut-être à partir de 2 ou 3 programmes d'envoi de signaux spéciaux. Mélangez également d'autres signaux, une fois que vous êtes sûr que votre code peut gérer SIGUSR1 et SIGUSR2 rapidement et correctement. Préparez-vous à un débogage difficile.
Si vous utilisez Linux et uniquement Linux, vous pourriez penser à utiliser signalfd()
pour créer un descripteur de fichier que vous pouvez select()
interroger pour recevoir ces signaux. L'utilisation signalfd()
pourrait faciliter le débogage.
signal(2)
suggère catégoriquement d'éviter cette confusion en utilisant à lasigaction(2)
place.