Fonctions de la bibliothèque C -sigprocmask()

Bibliothèque standard C - <signal.h>

Description

Dans le langage C,sigprocmaskLa fonction est utilisée pour vérifier ou modifier le masque de signaux du processus courant. Le masque de signaux détermine quels signaux sont bloqués pendant le masquage, c'est-à-dire temporairement non traités.

Syntaxe

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

Paramètre

  • int how: drapeaux d'opération qui déterminent comment le masque de signaux est modifié :
    • SIG_BLOCK: prendresetLes signaux de l'ensemble de signaux pointé sont ajoutés au masque de signaux courant.
    • SIG_UNBLOCK: retirer du masque de signaux courantsetles signaux de l'ensemble de signaux pointé.
    • SIG_SETMASK: utilisersetL'ensemble de signaux pointé remplace le masque de signaux courant.
  • const sigset_t *set: un pointeur vers le nouvel ensemble de signaux à utiliser pour la modification.
  • sigset_t *oldset: s'il n'est pasNULL, alors stocker le masque de signaux précédent.

Valeur de retour

  • Renvoie 0 en cas de succès.
  • Renvoie -1 en cas d'échec et définiterrnopour indiquer le type d'erreur.

Exemple

L'exemple suivant est un programme simple montrant comment utilisersigprocmaskfonction pour bloquerSIGINTun signal, puis le débloquer et vérifier le masque de signaux précédent :

Exemple

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

int main() {
    sigset_t new_mask, old_mask;
   
    // Initialiser un nouvel ensemble de signaux, contenant uniquement SIGINT
    sigemptyset(&new_mask);
    sigaddset(&new_mask, SIGINT);

    // Définir le nouveau masque de signaux pour bloquer le signal SIGINT
    if (sigprocmask(SIG_BLOCK, &new_mask, &old_mask) == -1) {
        perror("sigprocmask");
        return 1;
    }

    printf("Le signal SIGINT est bloqué. Attente de 5 secondes...\n");
    sleep(5);

    // Débloquer SIGINT
    if (sigprocmask(SIG_UNBLOCK, &new_mask, NULL) == -1) {
        perror("sigprocmask");
        return 1;
    }

    printf("Le signal SIGINT est débloqué.\n");

    return 0;
}

Résultat de sortie

La sortie possible de l'exécution du programme d'exemple ci-dessus est la suivante :

SIGINT signal is blocked. Sleeping for 5 seconds...

Pendant cette période, le signal SIGINT est bloqué, donc le programme attend 5 secondes.

SIGINT signal is unblocked.

Ensuite, le programme débloqueSIGINTDébloquez le signal et restaurez le traitement normal du signal :

Notes

  • UtilisationsigprocmaskLors de l'utilisation de la fonction, veillez à ce que les signaux critiques ne soient pas bloqués pendant longtemps (commeSIGKILLouSIGSTOP), ces signaux ne peuvent pas être bloqués ni capturés.
  • sigprocmaskLa fonction peut être utilisée pour contrôler la gestion des signaux dans les sections critiques, par exemple pour éviter le traitement des signaux d'interruption dans une section critique.

Bibliothèque standard C - <signal.h>

autres extensions