Maison  >  Article  >  Tutoriel système  >  Explication détaillée des fonctions de fonctionnement de l'ensemble de signaux Linux

Explication détaillée des fonctions de fonctionnement de l'ensemble de signaux Linux

WBOY
WBOYavant
2024-02-09 15:30:31694parcourir

Voyons d’abord ce qu’est un ensemble de signaux en attente. Lorsqu'un signal est généré et atteint sa destination, ce processus est appelé transmission du signal. L’état intermédiaire entre la génération du signal et sa délivrance est appelé l’état en attente du signal. La raison de l'état en attente peut être que le signal est bloqué, c'est-à-dire que le bit correspondant dans le mot du masque de signal (ou l'ensemble de signaux bloqués) est mis à 1. L'ensemble de signaux de blocage et l'ensemble de signaux en attente sont conservés par le noyau. L'ensemble du processus est montré dans l'image ci-dessous :

Explication détaillée des fonctions de fonctionnement de lensemble de signaux Linux

Parfois, nous devons bloquer un certain signal, nous devons donc modifier l'ensemble des signaux de blocage. Alors, comment modifier l’ensemble des signaux de blocage ? Une méthode fournie par le système consiste à créer d'abord un ensemble identique à l'ensemble de signaux de blocage, puis à l'utiliser pour modifier l'ensemble de signaux de blocage.

Le système fournit une série de fonctions de réglage des ensembles de signaux. Ces fonctions sont les suivantes :

sigset_t  set;

信号集数据类型,本质是typedef unsigned long sigset_t; 

int sigemptyset(sigset_t *set);

将某个信号集清0

int sigfillset(sigset_t *set);

将某个信号集置1

int sigaddset(sigset_t *set, int signum);

将某个信号加入信号集

int sigdelset(sigset_t *set, int signum);

将某个信号清出信号集

以上几个函数返回值均是:成功:0;失败:-1

int sigismember(const sigset_t *set, int signum);

判断某个信号是否在信号集中

返回值:在集合:1;不在:0;出错:-1

Après avoir créé le jeu de signaux à l'aide des fonctions ci-dessus, comment modifier le jeu de signaux de blocage ? Le système fournit une autre fonction : la fonction sigprocmask. La fonction sigprocmask peut être utilisée pour bloquer des signaux ou débloquer des signaux. Son essence est d'utiliser l'ensemble de signaux que nous avons créé pour modifier l'ensemble de signaux de blocage.

Prototype de fonction :

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

Valeur de retour :

Succès : 0 ; Échec : -1, définissez le numéro d'erreur

Explication des paramètres :

set : Le paramètre entrant est un bitmap. Le bit de l'ensemble est 1 indique quel signal est bloqué par le processus en cours.

oldset : paramètres sortants, enregistrez l'ancien jeu de masques de signal. C'est un peu similaire à setitimer.

comment valeur du paramètre :

Supposons que le mot actuel du masque de signal soit mask

1.SIG_BLOCK : Lorsque how est défini sur cette valeur, set indique le signal qui doit être bloqué. Équivalent à masque = ensemble de masques

2.SIG_UNBLOCK : Lorsque how est défini sur ceci, set indique le signal qui doit être débloqué. Équivalent à masque = masque & ~set

3.SIG_SETMASK : Lorsque how est défini sur ceci, set représente le nouvel ensemble de masques utilisé pour remplacer le masque d'origine. Équivalent à mask = set Si l'appel de sigprocmask débloque plusieurs signaux actuels, au moins un des signaux sera délivré avant le retour de sigprocmask.

Comment lire l'ensemble des signaux en attente ? Le système fournit la fonction d'attente.

Prototype de fonction :

int sigpending(sigset_t *set);

Description du paramètre :

définir les paramètres sortants.

Valeur de retour :

Valeur de retour : Succès : 0 ; Échec : -1, définissez le numéro d'erreur

Exemple : imprimez l'état d'attente de tous les signaux réguliers à l'écran.

#include 
#include 
#include 

void printPending(sigset_t *set)
{
    int i = 0;

    for (i = 0; i if (sigismember(set, i) == 1)
            printf("1");
        else
            printf("0");
    }
    printf("\n");
}

int main()
{
    sigset_t set, oldset, pendset;
    sigemptyset(&set);
    sigaddset(&set, SIGQUIT);   // ctrl + \ 将产生SIGQUIT信号
    sigprocmask(SIG_BLOCK, &set, &oldset);
    while (1) {
        sigpending(&pendset);
        printPending(&pendset);     // 写一个函数打印未决信号集
        sleep(1);
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer