Heim  >  Artikel  >  System-Tutorial  >  Detaillierte Erläuterung der Linux-Signalsatz-Betriebsfunktionen

Detaillierte Erläuterung der Linux-Signalsatz-Betriebsfunktionen

WBOY
WBOYnach vorne
2024-02-09 15:30:31647Durchsuche

Lassen Sie uns zunächst einen Blick darauf werfen, was ein ausstehender Signalsatz ist. Wenn ein Signal erzeugt wird und sein Ziel erreicht, wird dieser Vorgang als Signalübermittlung bezeichnet. Der Zwischenzustand von der Signalerzeugung bis zur Übermittlung wird als anstehender Zustand des Signals bezeichnet. Der Grund für den anstehenden Status kann sein, dass das Signal blockiert ist, d. h. das entsprechende Bit im Signalmaskenwort (oder im blockierten Signalsatz) auf 1 gesetzt ist. Sowohl der Blockierungssignalsatz als auch der ausstehende Signalsatz werden vom Kernel verwaltet. Der gesamte Vorgang ist im Bild unten dargestellt:

Detaillierte Erläuterung der Linux-Signalsatz-Betriebsfunktionen

Manchmal müssen wir ein bestimmtes Signal blockieren, also müssen wir den Blockierungssignalsatz ändern. Wie ändern wir also den Blockierungssignalsatz? Eine vom System bereitgestellte Methode besteht darin, dass wir zunächst einen Satz erstellen, der mit dem Blockierungssignalsatz übereinstimmt, und diesen dann zum Ändern des Blockierungssignalsatzes verwenden.

Das System bietet eine Reihe von Signalsatz-Einstellungsfunktionen. Diese Funktionen sind wie folgt:

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

Wie ändere ich den Blockiersignalsatz, nachdem ich den Signalsatz mit den oben genannten Funktionen erstellt habe? Das System bietet eine weitere Funktion: die Sigprocmask-Funktion. Die Sigprocmask-Funktion kann zum Blockieren oder Entsperren von Signalen verwendet werden. Ihr Kern besteht darin, den von uns erstellten Signalsatz zu verwenden, um den Blockierungssignalsatz zu ändern.

Funktionsprototyp:

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

Rückgabewert:

Erfolg: 0; Fehler: -1, Fehlernummer setzen

Parametererklärung:

set: Der eingehende Parameter ist eine Bitmap. Welches Bit im Set 1 ist, gibt an, welches Signal vom aktuellen Prozess blockiert wird.

oldset: Ausgehende Parameter, speichern Sie den alten Signalmaskensatz. Dies ähnelt in gewisser Weise dem Setitimer.

how-Parameterwert:

Angenommen, das aktuelle Signalmaskenwort ist mask

1.SIG_BLOCK: Wenn how auf diesen Wert eingestellt ist, gibt Set das Signal an, das blockiert werden muss. Entspricht mask = mask |. set

2.SIG_UNBLOCK: Wenn how darauf eingestellt ist, gibt Set das Signal an, das entsperrt werden muss. Entspricht mask = mask & ~set

3.SIG_SETMASK: Wenn how darauf eingestellt ist, stellt set den neuen Maskensatz dar, der zum Ersetzen der Originalmaske verwendet wird. Entspricht mask = set. Wenn der Aufruf von sigprocmask mehrere aktuelle Signale entsperrt, wird mindestens eines der Signale übermittelt, bevor sigprocmask zurückkehrt.

Wie lesen wir die Menge der ausstehenden Signale? Das System bietet die Signpending-Funktion.

Funktionsprototyp:

int sigpending(sigset_t *set);

Parameterbeschreibung:

Ausgehende Parameter festlegen.

Rückgabewert:

Rückgabewert: Erfolg: 0; Fehler: -1, set errno

Beispiel: Drucken Sie den ausstehenden Status aller regulären Signale auf dem Bildschirm aus.

#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);
    }
}

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Linux-Signalsatz-Betriebsfunktionen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:lxlinux.net. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen