[Système d'exploitation Linux] Exploration approfondie des fonctions de fonctionnement des ensembles de signaux dans la programmation du système Linux

Dans la programmation du système Linux, les fonctions d'exploitation des ensembles de signaux sont des outils très importants, ils nous permettent de gérer et de contrôler les signaux. Ce blog présentera en détail les fonctions d'exploitation des ensembles de signaux dans la programmation du système Linux, y compris la création, l'ajout et la suppression d'ensembles de signaux, ainsi que les fonctions communes pour l'exploitation des ensembles de signaux. En comprenant ces fonctions en profondeur, nous serons en mesure de mieux comprendre et appliquer le mécanisme de traitement du signal dans la programmation du système Linux.
insérer la description de l'image ici



Tout d'abord, la création et l'initialisation de l'ensemble de signaux

Dans le système Linux, le type de données sigset_t est utilisé pour représenter l'ensemble de signaux. Nous pouvons utiliser les fonctions suivantes pour créer et initialiser un ensemble de signaux :

  1. sigemptyset(sigset_t *set): Effacer l'ensemble de signaux, c'est-à-dire supprimer tous les signaux de l'ensemble de signaux.

Exemple:

#include <signal.h>

int main() {
    
    
    sigset_t set;
    sigemptyset(&set);
    // 现在set为空信号集
    return 0;
}

  1. sigfillset(sigset_t *set): Ajoutez tous les signaux à l'ensemble de signaux.

Exemple:

#include <signal.h>

int main() {
    
    
    sigset_t set;
    sigfillset(&set);
    // 现在set包含了所有信号
    return 0;
}

  1. sigaddset(sigset_t *set, int signum): ajoute le signal spécifié à l'ensemble de signaux.

Exemple:

#include <signal.h>

int main() {
    
    
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);
    // 现在set中包含了SIGINT信号
    return 0;
}

  1. sigdelset(sigset_t *set, int signum): Supprime le signal spécifié du jeu de signaux.

Exemple:

#include <signal.h>

int main() {
    
    
    sigset_t set;
    sigfillset(&set);
    sigdelset(&set, SIGINT);
    // 现在set中不包含SIGINT信号
    return 0;
}


2. Fonctionnement et interrogation de l'ensemble de signaux

Après avoir créé et initialisé un ensemble de signaux, nous pouvons opérer et interroger l'ensemble de signaux à l'aide des fonctions suivantes :

  1. sigismember(const sigset_t *set, int signum): Vérifiez si le signal spécifié est dans l'ensemble de signaux.

Exemple:

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

int main() {
    
    
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);

    if (sigismember(&set, SIGINT)) {
    
    
        printf("SIGINT is in the set\n");
    } else {
    
    
        printf("SIGINT is not in the set\n");
    }
    return 0;
}

  1. sigprocmask(int how, const sigset_t *set, sigset_t *oldset): Utilisé pour bloquer ou débloquer le signal spécifié.

Exemple:

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

int main() {
    
    
    sigset_t set, oldset;
    sigemptyset(&set);
    sigaddset(&set, SIGINT);

    sigprocmask(SIG_BLOCK, &set, &oldset);
    // 现在SIGINT信号被阻塞

    // 执行一些需要阻塞SIGINT信号的代码

    sigprocmask(SIG_UNBLOCK, &set, NULL);
    // 现在解除对SIGINT信号的阻塞

    return 0;
}

3. Utilisez des ensembles de signaux pour le traitement du signal

La fonction d'opération d'ensemble de signaux peut également être utilisée avec la fonction de traitement du signal pour réaliser le traitement d'un signal spécifique.

  1. sigaction(int signum, const struct sigaction *act, struct sigaction *oldact): Il est utilisé pour définir la fonction de traitement du signal spécifié.

Exemple:

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

void handle_signal(int signum) {
    
    
    printf("Received signal: %d\n", signum);
}

int main() {
    
    
    struct sigaction sa;
    sa.sa_handler = handle_signal;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;

    sigaction(SIGINT, &sa, NULL);
    // 设置SIGINT信号的处理函数为handle_signal

    while (1) {
    
    
        // 执行一些其他的工作
    }

    return 0;
}


4. Exemple complet

Exemple de code :

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

void signal_handler(int signum) {
    
    
    printf("Received signal %d\n", signum);
}

int main() {
    
    
    sigset_t set;
    struct sigaction sa;

    sigemptyset(&set); // 初始化信号集set为空集

    sigaddset(&set, SIGINT); // 将SIGINT信号添加到set中
    sigaddset(&set, SIGUSR1); // 将SIGUSR1信号添加到set中

    sa.sa_handler = signal_handler;
    sa.sa_mask = set;
    sa.sa_flags = 0;

    sigaction(SIGINT, &sa, NULL); // 设置SIGINT的信号处理函数为signal_handler
    sigaction(SIGUSR1, &sa, NULL); // 设置SIGUSR1的信号处理函数为signal_handler

    int is_member1 = sigismember(&set, SIGINT); // 检查SIGINT是否在set中
    int is_member2 = sigismember(&set, SIGUSR1); // 检查SIGUSR1是否在set中

    printf("is_member1: %d\n", is_member1); // 输出1,表示SIGINT在set中
    printf("is_member2: %d\n", is_member2); // 输出1,表示SIGUSR1在set中

    return 0;
}

expliquer:

  1. Tout d’abord, nous créons un ensemble de signaux et utilisons sigemptyset()la fonction pour l’initialiser sur un ensemble vide.

  2. Nous utilisons ensuite sigaddset()des fonctions pour ajouter les signaux SIGINT et SIGUSR1 à l'ensemble.

  3. Ensuite, nous définissons une structure struct sigactionet définissons sa variable membre sa_handlercomme signal_handlerfonction de traitement du signal.

  4. Ensuite, nous utilisons set as sa_mask, c'est-à-dire définir l'ensemble de signaux à bloquer pendant l'exécution de la fonction de gestionnaire de signal.

  5. À l'aide sigaction()de la fonction, nous définissons la fonction de gestionnaire de signal pour SIGINT et SIGUSR1 signal_handler.

  6. À l'aide sigismember()de la fonction, nous avons vérifié si les signaux SIGINT et SIGUSR1 sont dans l'ensemble. Puisque nous avons ajouté ces deux signaux dans l’ensemble, la sortie est 1.

Guess you like

Origin blog.csdn.net/Goforyouqp/article/details/132360707