C-Bibliotheksfunktionen -sigaction()
C-Standardbibliothek - <signal.h>
sigactionDie Funktion ist eine C-Standardbibliotheksfunktion, die verwendet wird, um die mit einem bestimmten Signal verbundene Behandlungsaktion zu prüfen oder zu ändern. MitsignalVerglichen mit der Funktion,sigactionBietet mehr Kontrolle und bessere Portabilität.
Syntax
int sigaction(int sig, const struct sigaction *act, struct sigaction *oldact);
Parameter
int sig: Die Signalnummer, die geprüft oder geändert werden soll. Häufige Signale sindSIGINT、SIGTERM、SIGKILLusw.const struct sigaction *act: Ein Zeiger auf die neue Signalbehandlungsaktion. Wenn erNULL, wird die aktuelle Signalbehandlungsaktion nicht geändert.struct sigaction *oldact: Ein Zeiger zum Speichern der alten Signalbehandlungsaktion. Wenn erNULL, die alte Signalbehandlungsaktion wird nicht gespeichert.
struct sigactionStruktur
struct sigaction {
void (*sa_handler)(int); // 信号处理函数指针
void (*sa_sigaction)(int, siginfo_t *, void *); // 信号处理函数指针(扩展)
sigset_t sa_mask; // 在处理该信号时要阻塞的信号集
int sa_flags; // 修改信号行为的选项
void (*sa_restorer)(void); // 恢复函数,已废弃
};
sa_flagsallgemeine Optionen
SA_RESTART: Systemaufrufe, die durch das Signal unterbrochen wurden, automatisch neu starten.SA_SIGINFO: Verwendensa_sigactionanstelle vonsa_handlerals Signalbehandlungsfunktion.SA_NOCLDSTOP: wennsigJaSIGCHLD, das Signal wird nicht erzeugt, wenn ein Kindprozess angehalten oder fortgesetzt wird.
Rückgabewert
- Gibt bei Erfolg 0 zurück.
- gibt im Fehlerfall -1 zurück und setzt
errno, um die Art des Fehlers anzugeben.
Beispiel
Das Folgende ist ein einfaches Beispielprogramm, das zeigt, wie mansigactionFunktionseinstellungenSIGINTSignalhandler:
Beispiel
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
// Benutzerdefinierte Signalbehandlungsfunktion
void handle_sigint(int sig) {
printf("Signal %d empfangen\n", sig);
}
int main() {
struct sigaction sa;
// Den Handler auf handle_sigint setzen
sa.sa_handler = handle_sigint;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
// sigaction verwenden, um die neue Signalbehandlungsaktion festzulegen
if (sigaction(SIGINT, &sa, NULL) == -1) {
perror("sigaction");
return 1;
}
// Hauptschleife, läuft weiter, bis ein Signal abgefangen wird
while (1) {
printf("Läuft...\n");
sleep(1);
}
return 0;
}
#include <signal.h>
#include <unistd.h>
// Benutzerdefinierte Signalbehandlungsfunktion
void handle_sigint(int sig) {
printf("Signal %d empfangen\n", sig);
}
int main() {
struct sigaction sa;
// Den Handler auf handle_sigint setzen
sa.sa_handler = handle_sigint;
sigemptyset(&sa.sa_mask);
sa.sa_flags = 0;
// sigaction verwenden, um die neue Signalbehandlungsaktion festzulegen
if (sigaction(SIGINT, &sa, NULL) == -1) {
perror("sigaction");
return 1;
}
// Hauptschleife, läuft weiter, bis ein Signal abgefangen wird
while (1) {
printf("Läuft...\n");
sleep(1);
}
return 0;
}
Nach dem Kompilieren und Ausführen des Programms lautet die Ausgabe:
Running... Running... Running... ...
Wenn Strg+C gedrückt wird (Senden einesSIGINTSignals), lautet die Ausgabe:
Caught signal 2
Das Programm hatSIGINT-Signal empfangen und führt eine benutzerdefinierte Signalbehandlungsfunktion aushandle_sigint, und setzt dann die Hauptschleife fort.
Hinweise
sigactionDie Funktion bietet mehr alssignalDie Funktion bietet umfangreichere Funktionalität und ermöglicht es Ihnen, Signalhandler, Signalmasken und Signalbehandlungsoptionen festzulegen.- Die Signalbehandlungsfunktion sollte so kurz wie möglich sein, da während der Behandlung eines Signals andere Signale blockiert werden. Wenn die Signalbehandlungsfunktion zu lange läuft, kann dies die Echtzeitleistung des Programms beeinträchtigen.
- Bestimmte Signale (wie z. B.
SIGKILLundSIGSTOP) können nicht abgefangen oder ignoriert werden.