Fonctions de bibliothèque C -sigpending()

sigpendingUne fonction de la bibliothèque standard C utilisée pour obtenir l'ensemble des signaux en attente pour le processus courant. Les signaux en attente sont des signaux qui ont été bloqués mais pas encore traités. Cette fonction est définie dans<signal.h>Dans le fichier d'en-tête.

Syntaxe

int sigpending(sigset_t *set);

Paramètre

  • sigset_t *set: pointe vers unsigset_tUne variable de type, qui sera remplie avec l'ensemble des signaux en attente pour le processus courant.

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

Ce qui suit est un exemple utilisantsigpendingUn exemple de programme de la fonction récupérant l'ensemble des signaux en attente du processus courant. Le programme bloqueSIGINTsignal, puis envoie ce signal, et utilisesigpendingVérifie si ce signal se trouve dans l'ensemble des signaux en attente.

Exemple

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

void handle_sigint(int sig) {
    printf("Signal intercepté %d\n", sig);
}

int main() {
    sigset_t new_mask, old_mask, pending;

    // Définir le gestionnaire pour SIGINT
    signal(SIGINT, handle_sigint);

    // Initialiser l'ensemble de signaux et bloquer le signal SIGINT
    sigemptyset(&new_mask);
    sigaddset(&new_mask, SIGINT);
    if (sigprocmask(SIG_BLOCK, &new_mask, &old_mask) == -1) {
        perror("sigprocmask");
        return 1;
    }

    // Envoyer le signal SIGINT
    raise(SIGINT);

    // Obtenir l'ensemble des signaux en attente
    if (sigpending(&pending) == -1) {
        perror("sigpending");
        return 1;
    }

    // Vérifier si SIGINT est dans l'ensemble des signaux en attente
    if (sigismember(&pending, SIGINT)) {
        printf("SIGINT est en attente\n");
    } else {
        printf("SIGINT n'est pas en attente\n");
    }

    // Restaurer le masque de signaux d'origine
    if (sigprocmask(SIG_SETMASK, &old_mask, NULL) == -1) {
        perror("sigprocmask");
        return 1;
    }

    return 0;
}

Après compilation et exécution du programme, la sortie sera :

SIGINT is pending
Caught signal 2

Le programme bloque d'abordSIGINTsignal, puis envoie ce signal, et utilisesigpendingVérifieSIGINTS'il se trouve dans l'ensemble des signaux en attente. Enfin, le programme restaure le masque de signaux d'origine et intercepteSIGINTsignal, exécute le gestionnaire de signal.

Analyse syntaxique

  • sigset_t new_mask, old_mask, pending;: définit trois ensembles de signaux, utilisés pour contrôler le masquage des signaux et stocker l'ensemble des signaux en attente.
  • UtilisationsigprocmaskFonction de blocageSIGINTSignal, et sauvegarde le masque de signaux d'origine.
  • UtilisationraiseFonction d'envoiSIGINTsignal.
  • UtilisationsigpendingLa fonction récupère l'ensemble des signaux en attente et vérifieSIGINTs'il se trouve dans l'ensemble des signaux en attente.
  • UtilisationsigprocmaskLa fonction restaure le masque de signaux d'origine.

Notes

  • sigpendingLa fonction récupère l'ensemble des signaux en attente du processus courant, y compris tous les signaux qui ont été envoyés mais pas encore traités.
  • Les fonctions de gestion de signaux doivent être aussi courtes que possible, car les autres signaux sont bloqués pendant le traitement d'un signal. Les fonctions de gestion de signaux longues à exécuter peuvent affecter les performances temps réel du programme.

Bibliothèque standard C - <signal.h>

autres extensions