C-Bibliotheksfunktionen -sigpending()

sigpendingEine Funktion in der C-Standardbibliothek, die verwendet wird, um die Menge der ausstehenden Signale für den aktuellen Prozess zu erhalten. Ausstehende Signale sind Signale, die blockiert, aber noch nicht behandelt wurden. Diese Funktion ist definiert in<signal.h>In der Header-Datei.

Syntax

int sigpending(sigset_t *set);

Parameter

  • sigset_t *set: zeigt auf einesigset_tEine Variable vom Typ, die mit der Menge der ausstehenden Signale für den aktuellen Prozess gefüllt wird.

Rückgabewert

  • Gibt bei Erfolg 0 zurück.
  • Gibt bei Fehler -1 zurück und setzterrno, um die Art des Fehlers anzugeben.

Beispiel

Das Folgende ist ein Beispiel unter Verwendung vonsigpendingEin Beispielprogramm für die Funktion, die die Menge der ausstehenden Signale des aktuellen Prozesses abruft. Das Programm blockiertSIGINTSignal, sendet dann dieses Signal und verwendetsigpendingPrüft, ob dieses Signal in der Menge der ausstehenden Signale enthalten ist.

Beispiel

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

void handle_sigint(int sig) {
    printf("Signal %d empfangen\n", sig);
}

int main() {
    sigset_t new_mask, old_mask, pending;

    // Handler für SIGINT festlegen
    signal(SIGINT, handle_sigint);

    // Signalmenge initialisieren und SIGINT-Signal blockieren
    sigemptyset(&new_mask);
    sigaddset(&new_mask, SIGINT);
    if (sigprocmask(SIG_BLOCK, &new_mask, &old_mask) == -1) {
        perror("sigprocmask");
        return 1;
    }

    // SIGINT-Signal senden
    raise(SIGINT);

    // Ausstehendes Signal-Set abrufen
    if (sigpending(&pending) == -1) {
        perror("sigpending");
        return 1;
    }

    // Prüfen, ob sich SIGINT im ausstehenden Signal-Set befindet
    if (sigismember(&pending, SIGINT)) {
        printf("SIGINT ist ausstehend\n");
    } else {
        printf("SIGINT ist nicht ausstehend\n");
    }

    // Ursprüngliche Signalmaske wiederherstellen
    if (sigprocmask(SIG_SETMASK, &old_mask, NULL) == -1) {
        perror("sigprocmask");
        return 1;
    }

    return 0;
}

Nach dem Kompilieren und Ausführen des Programms lautet die Ausgabe:

SIGINT is pending
Caught signal 2

Das Programm blockiert zuerstSIGINTSignal, sendet dann dieses Signal und verwendetsigpendingPrüftSIGINTOb es sich im ausstehenden Signal-Set befindet. Abschließend stellt das Programm die ursprüngliche Signalmaske wieder her und fängtSIGINTdas Signal ab, führt den Signalhandler aus.

Parsen

  • sigset_t new_mask, old_mask, pending;: definiert drei Signal-Sets, die verwendet werden, um die Signal-Maskierung zu steuern und das ausstehende Signal-Set zu speichern.
  • NutzungsigprocmaskFunktion zum BlockierenSIGINTSignal und speichert die ursprüngliche Signalmaske.
  • NutzungraiseFunktion zum SendenSIGINTSignal.
  • NutzungsigpendingDie Funktion ruft die Menge der ausstehenden Signale ab und prüftSIGINTob es in der Menge der ausstehenden Signale enthalten ist.
  • NutzungsigprocmaskDie Funktion stellt die ursprüngliche Signalmaske wieder her.

Hinweise

  • sigpendingDie Funktion ruft die Menge der ausstehenden Signale des aktuellen Prozesses ab, einschließlich aller Signale, die gesendet, aber noch nicht behandelt wurden.
  • Signalhandler-Funktionen sollten so kurz wie möglich sein, da während der Verarbeitung eines Signals andere Signale blockiert werden. Lang laufende Signalhandler-Funktionen können die Echtzeitleistung des Programms beeinträchtigen.

C-Standardbibliothek - <signal.h>

Weitere Erweiterungen