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.­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top