Set e Oldset in sigprocmask()
-
09-06-2019 - |
Domanda
Non ho capito completamente come usarlo sigprocmask()
.In particolare, come set
E oldset
e il suo lavoro di sintassi e come usarli.
int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
Si prega di spiegare con un esempio, per bloccare, dire SIGUSR1 per alcuni secondi, quindi sbloccarlo e gestirlo.
Soluzione
L'idea è che tu fornisca una maschera set
, effettivamente un elenco di segnali.IL how
l'argomento dice cosa dovresti fare con la maschera set
.
Puoi usare entrambi SIG_BLOCK
per bloccare i segnali in set
elenco o SIG_UNBLOCK
per sbloccarli.Nessuno di questi modifica i segnali che non sono impostati nell'elenco. SIG_SETMASK
blocca i segnali nell'elenco e sblocca quelli che non sono impostati nell'elenco.
Ad esempio, supponiamo che il vecchio elenco di blocco fosse {SIGSEGV, SIGSUSP}
e tu chiami sigprocmask
con queste argomentazioni:
sigset_t x;
sigemptyset (&x);
sigaddset(&x, SIGUSR1);
sigprocmask(SIG_BLOCK, &x, NULL)
Il nuovo elenco di blocco sarà ora {SIGSEGV, SIGSUSP, SIGUSR1}
.
Se chiami sigprocmask
con questi argomenti ora:
sigprocmask(SIG_UNBLOCK, &x, NULL)
La nuova lista di blocco tornerà ad essere {SIGSEGV, SIGSUSP}
.
Se chiami sigprocmask
con questi argomenti ora:
sigprocmask(SIG_SETMASK, &x, NULL)
Il nuovo elenco di blocco verrà ora impostato su {SIGUSR1}
.
IL oldset
L'argomento ti dice quale era l'elenco di blocco precedente.Se abbiamo questa dichiarazione:
sigset_t y;
e chiamiamo il codice negli esempi precedenti in questo modo:
sigprocmask(SIG_BLOCK, &x, &y)
ora abbiamo:
y == {SIGSEGV, SIGSUSP}
Se ora facciamo:
sigprocmask(SIG_UNBLOCK, &x, &y)
otterremo
y == {SIGSEGV, SIGSUSP, SIGUSR1}
e se lo facciamo:
sigprocmask(SIG_SET, &x, &y)
otterremo questo:
y == {SIGSEGV, SIGSUSP}
perché questo è il valore precedente del set di blocco.