Fonctions de la bibliothèque C -sigsuspend()

Bibliothèque standard C - <signal.h>

sigsuspendLa fonction est une fonction de la bibliothèque standard C, utilisée pour remplacer temporairement le masque de signaux actuel et suspendre le processus jusqu'à ce qu'un signal soit capturé. Elle est souvent utilisée pour implémenter une attente atomique de signal, c'est-à-dire qu'aucun signal n'est perdu pendant l'attente d'un signal.

Syntaxe

int sigsuspend(const sigset_t *mask);

Paramètre

  • const sigset_t *mask: Pointeur vers le nouveau masque de signaux.sigsuspendUtilisez ce masque de signaux pour remplacer le masque de signaux actuel, et restaurez le masque de signaux d'origine après avoir capturé un signal.

Valeur de retour

  • sigsuspendLa fonction renvoie toujours -1, eterrnoDéfini àEINTR, ce qui indique que la fonction a été interrompue par un signal.

Exemple

Ce qui suit est une utilisation desigsuspendExemple de programme pour une fonction attendant un signal spécifique. Le programme met en place un gestionnaire de signal, puis utilisesigsuspendSuspend le processus jusqu'à ce qu'un signal soit capturé.

Exemple

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

volatile sig_atomic_t flag = 0;

// Fonction personnalisée de gestion du signal
void handle_sigint(int sig) {
    printf("Signal intercepté %d\n", sig);
    flag = 1;
}

int main() {
    struct sigaction sa;
    sigset_t new_mask, old_mask, wait_mask;

    // Définir le gestionnaire pour SIGINT sur handle_sigint
    sa.sa_handler = handle_sigint;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;
    if (sigaction(SIGINT, &sa, NULL) == -1) {
        perror("sigaction");
        return 1;
    }

    // Initialiser l'ensemble de signaux
    sigemptyset(&new_mask);
    sigaddset(&new_mask, SIGINT);

    // Bloquer le signal SIGINT
    if (sigprocmask(SIG_BLOCK, &new_mask, &old_mask) == -1) {
        perror("sigprocmask");
        return 1;
    }

    // Initialiser l'ensemble de signaux d'attente
    sigemptyset(&wait_mask);

    printf("En attente de SIGINT...\n");

    // Utiliser sigsuspend pour suspendre le processus et attendre un signal
    while (!flag) {
        if (sigsuspend(&wait_mask) != -1) {
            perror("sigsuspend");
            return 1;
        }
    }

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

    printf("Sortie...\n");

    return 0;
}

En supposant que le programme soit compilé et exécuté, la sortie sera :

Waiting for SIGINT...

Lorsque vous appuyez sur Ctrl+C (envoi duSIGINTsignal), la sortie sera :

Caught signal 2
Exiting...

Le programme a captéSIGINTsignal, et le gestionnaire de signal a été exécutéhandle_sigint, ensembleflagà 1, ce qui provoque la terminaison de la boucle principale et la sortie du programme.

Explication

  • sigset_t new_mask, old_mask, wait_mask;: définit trois ensembles de signaux, utilisés pour contrôler le masque de signaux.
  • UtilisationsigprocmaskFonction de blocageSIGINTsignal, et sauvegarde le masque de signaux d'origine.
  • UtilisationsigsuspendLa fonction suspend le processus et attend un signal.sigsuspendRemplace temporairement le masque de signaux actuel parwait_masket le masque de signaux d'origine après avoir capté le signal.
  • Après avoir capté le signal, restaurez le masque de signaux d'origine et poursuivez l'exécution du programme.

Notes

  • sigsuspendSouvent utilisé pour implémenter un mécanisme fiable d'attente de signal, évitant la perte de signal pendant la période de masquage.
  • Les fonctions gestionnaires de signaux doivent être aussi courtes que possible, car les autres signaux sont bloqués pendant le traitement d'un signal. Un gestionnaire de signaux de longue durée peut affecter les performances en temps réel du programme.

Bibliothèque standard C - <signal.h>

autres extensions