Question

J'utilise sigprocmask comme suit:

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 je invoquons masque () à son début. Il semble que le masque échoue, car ma fonction n'invoque d'autres fonctions et donc nulle part dans sa course si un démasquent () se produire. Que peut causer sigprocmask échouer?

Était-ce utile?

La solution

De la spécifications Posix, retourne sigprocmask() -1 et définit errno accoringly si elle échoue. Si le code que vous avez envoyé le code que vous utilisez, vous ne vérifiez pas évidemment pour voir si elle a réussi.

Si sigprocmask() réussit, et il est en effet SIGALRM qui interrompt la fonction qui appelle mask(), il y a un 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 l'appel mask(), si son ignoré, puis une autre fonction ci-dessous qui est en train de changer le comportement.

bmargulies mentionnés dans les observations (qui sans doute aurait dû être une réponse), vous pouvez utiliser strace pour voir si cela est en effet le cas, couplé avec ltrace le cas échéant pour regarder défiler les appels bibliothèque.

Ce n'est pas du tout rare lorsque vous travaillez avec des bibliothèques qui sont impolis quand il s'agit d'installer des gestionnaires (par exemple vérifier si un signal est ignoré ou traité ailleurs avant de modifier le comportement).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top