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 setzt
errno, 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 <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.- Nutzung
sigprocmaskFunktion zum BlockierenSIGINTSignal und speichert die ursprüngliche Signalmaske. - Nutzung
raiseFunktion zum SendenSIGINTSignal. - Nutzung
sigpendingDie Funktion ruft die Menge der ausstehenden Signale ab und prüftSIGINTob es in der Menge der ausstehenden Signale enthalten ist. - Nutzung
sigprocmaskDie 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.