2010-05-26 7 views
0

J'utilise sigprocmask comme suit:sigprocmask ne fonctionne pas

void mask(){ 
    sigset_t new_set,old_set; 
    sigemptyset(&new_set); 
    sigaddset(&new_set,SIGALRM); 
    sigprocmask(SIG_BLOCK, &new_set, &old_set); 
} 

et à ma grande surprise une fonction qui imprime une grande liste est en quelque sorte interrompue par le signal, même si j'invoque masque() à son début. Il semble que le masque échoue, car ma fonction n'invoque aucune autre fonction et, par conséquent, aucun démasquage() ne devrait se produire dans son exécution. Qu'est-ce qui peut provoquer l'échec de sigprocmask?

+0

utiliser strace pour vérifier si quelque chose d'autre est démasquer? – bmargulies

Répondre

1

À partir du POSIX spec, sigprocmask() renvoie -1 et définit errno de manière concise s'il échoue. Si le code que vous avez publié est le code que vous utilisez, vous ne vérifiez évidemment pas s'il a réussi.

Si sigprocmask() réussit, et il est en effet SIGALRM qui interrompt la fonction qui appelle mask(), il y a une très bonne chance que quelque chose dans cette fonction gère ce signal différemment.

L'autre chose que vous pouvez faire est raise(SIGALRM) immédiatement après avoir appelé mask(), si elle est ignorée, alors une autre fonction ci-dessous qui change le comportement.

Comme bmargulies noté dans les commentaires (qui aurait probablement dû être une réponse), vous pouvez utiliser strace pour voir si cela est bien le cas, couplé avec ltrace le cas échéant pour le regarder à travers l'étape des appels de bibliothèque.

Cela n'est pas inhabituel lorsque vous travaillez avec des bibliothèques qui sont grossières lorsqu'il s'agit d'installer des gestionnaires (par exemple, vérifier si un signal est ignoré ou manipulé ailleurs avant de modifier le comportement).