Fonctions de la bibliothèque C -sigaction()

Bibliothèque standard C - <signal.h>

sigactionLa fonction est une fonction de la bibliothèque standard C utilisée pour vérifier ou modifier l'action de traitement associée à un signal spécifique. AvecsignalComparé à la fonction,sigactionOffre plus de contrôle et une meilleure portabilité.

Syntaxe

int sigaction(int sig, const struct sigaction *act, struct sigaction *oldact);

Paramètre

  • int sig: Le numéro de signal à inspecter ou à modifier. Les signaux courants comprennentSIGINT、SIGTERM、SIGKILLetc.
  • const struct sigaction *act: Un pointeur vers la nouvelle action de traitement du signal. S'il estNULL, l'action de traitement du signal actuelle n'est pas modifiée.
  • struct sigaction *oldact: Un pointeur pour enregistrer l'ancienne action de traitement du signal. S'il estNULL, l'ancienne action de gestion du signal n'est pas sauvegardée.

struct sigactionStructure

struct sigaction {
    void (*sa_handler)(int);           // 信号处理函数指针
    void (*sa_sigaction)(int, siginfo_t *, void *); // 信号处理函数指针(扩展)
    sigset_t sa_mask;                  // 在处理该信号时要阻塞的信号集
    int sa_flags;                      // 修改信号行为的选项
    void (*sa_restorer)(void);         // 恢复函数,已废弃
};

sa_flagsoptions courantes

  • SA_RESTART: Redémarrer automatiquement les appels système interrompus par le signal.
  • SA_SIGINFO: Utilisersa_sigactionau lieu desa_handlercomme fonction de gestion du signal.
  • SA_NOCLDSTOP: sisigOuiSIGCHLD, le signal n'est pas généré lorsqu'un processus enfant s'arrête ou reprend.

Valeur de retour

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

Exemple

L'exemple suivant est un programme simple montrant comment utilisersigactionParamètres de la fonctionSIGINTGestionnaire de signal :

Exemple

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

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

int main() {
    struct sigaction sa;

    // Définir le gestionnaire sur handle_sigint
    sa.sa_handler = handle_sigint;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;

    // Utiliser sigaction pour définir la nouvelle action de gestion du signal
    if (sigaction(SIGINT, &sa, NULL) == -1) {
        perror("sigaction");
        return 1;
    }

    // Boucle principale, continue de s'exécuter jusqu'à ce qu'un signal soit capté
    while (1) {
        printf("En cours d'exécution...\n");
        sleep(1);
    }

    return 0;
}

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

Running...
Running...
Running...
...

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

Caught signal 2

Le programme a captéSIGINTle signal et exécute une fonction de gestion de signal personnaliséehandle_sigint, puis continue d'exécuter la boucle principale.

Notes

  • sigactionLa fonction fournit plus quesignalLa fonction offre des fonctionnalités plus riches, vous permettant de définir des gestionnaires de signaux, des masques de signaux et des options de gestion des signaux.
  • La fonction de gestion des signaux doit être aussi courte que possible, car les autres signaux sont bloqués pendant le traitement d'un signal. Si la fonction de gestion des signaux s'exécute trop longtemps, cela peut affecter les performances en temps réel du programme.
  • Certains signaux (tels queSIGKILLetSIGSTOP) ne peuvent pas être capturés ni ignorés.

Bibliothèque standard C - <signal.h>

autres extensions