Définir et Oldset dans sigprocmask()
-
09-06-2019 - |
Question
Je n'ai pas complètement compris comment l'utiliser sigprocmask()
.En particulier, comment le set
et oldset
et son travail de syntaxe et comment les utiliser.
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
Veuillez expliquer avec un exemple, pour bloquer, dites SIGUSR1 pendant quelques secondes, puis débloquez et gérez-le.
La solution
L'idée est que vous fournissiez un masque set
, en fait une liste de signaux.Le how
l'argument dit ce que vous devriez faire avec le masque dans set
.
Vous pouvez soit utiliser SIG_BLOCK
pour bloquer les signaux dans le set
liste, ou SIG_UNBLOCK
pour les débloquer.Aucun de ces éléments ne modifie les signaux qui ne sont pas définis dans la liste. SIG_SETMASK
bloque les signaux de la liste et débloque ceux qui ne sont pas définis dans la liste.
Par exemple, supposons que l'ancienne liste de blocage était {SIGSEGV, SIGSUSP}
et tu appelles sigprocmask
avec ces arguments :
sigset_t x;
sigemptyset (&x);
sigaddset(&x, SIGUSR1);
sigprocmask(SIG_BLOCK, &x, NULL)
La nouvelle liste de blocage sera désormais {SIGSEGV, SIGSUSP, SIGUSR1}
.
Si tu appelles sigprocmask
avec ces arguments maintenant:
sigprocmask(SIG_UNBLOCK, &x, NULL)
La nouvelle liste de blocage redeviendra {SIGSEGV, SIGSUSP}
.
Si tu appelles sigprocmask
avec ces arguments maintenant:
sigprocmask(SIG_SETMASK, &x, NULL)
La nouvelle liste de blocage sera désormais définie sur {SIGUSR1}
.
Le oldset
L'argument vous indique quelle était la liste de blocage précédente.Si nous avons cette déclaration :
sigset_t y;
et nous appelons le code des exemples précédents comme ceci :
sigprocmask(SIG_BLOCK, &x, &y)
maintenant nous avons:
y == {SIGSEGV, SIGSUSP}
Si nous faisons maintenant :
sigprocmask(SIG_UNBLOCK, &x, &y)
nous aurons
y == {SIGSEGV, SIGSUSP, SIGUSR1}
et si nous le faisons :
sigprocmask(SIG_SET, &x, &y)
nous obtiendrons ceci :
y == {SIGSEGV, SIGSUSP}
car c'est la valeur précédente de l'ensemble de blocage.