Provided by: manpages-de-dev_4.27.0-1_all 

BEZEICHNUNG
sigaction, rt_sigaction - Signalaktionen untersuchen und ändern
BIBLIOTHEK
Standard-C-Bibliothek (libc, -lc)
ÜBERSICHT
#include <signal.h>
int sigaction(int signum,
const struct sigaction *_Nullable restrict akt,
struct sigaction *_Nullable restrict altakt);
Mit Glibc erforderliche Feature-Test-Makros (siehe feature_test_macros(7)):
sigaction():
_POSIX_C_SOURCE
siginfo_t:
_POSIX_C_SOURCE >= 199309L
BESCHREIBUNG
Der Systemaufruf sigaction wird zur Veränderung der von einem Prozess beim Empfang eines Signals
durchgeführten Aktion benutzt. (Siehe signal(7) für einen Überblick über Signale.)
signum legt das Signal fest und kann jedes gültige Signal außer SIGKILL und SIGSTOP sein.
Falls akt nicht NULL ist, wird die neue Aktion für Signal signum aus akt installiert. Falls altakt nicht
NULL ist, wird die vorherige Aktion in altakt gespeichert.
Die Struktur sigaction wird durch etwas wie das folgende definiert:
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
void (*sa_restorer)(void);
};
Auf einigen Architekturen ist eine Union beteiligt; weisen Sie diese nicht sowohl sa_handler als auch
sa_sigaction zu.
Das Feld sa_restorer ist nicht zur Verwendung durch Anwendungen gedacht. (POSIX spezifiziert ein Feld
sa_restorer nicht.) Weitere Details über den Zweck dieses Feldes finden Sie in sigreturn(2).
sa_handler bestimmt die Aktion, die signum zugeordnet werden soll und kann eine der folgenden sein:
• SIG_DFL für die Standardaktion.
• SIG_IGN um dieses Signal zu ignorieren.
• Ein Zeiger auf eine Signalhandhabungsfunktion. Diese Funktion empfängt die Signalnummer als sein
einziges Argument.
Falls SA_SIGINFO in sa_flags festgelegt ist, dann legt sa_sigaction (statt sa_handler) die
Signal-Handhabungsfunktion für signum fest. Diese Funktion empfängt wie unten beschrieben drei Argumente.
sa_mask legt eine Signalmaske fest, die angibt, welche Signale während der Ausführung der
Signalhandhabungsfunktion blockiert (d.h. zu der Signalmaske des Threads, in der der Signal-Handler
aufgerufen wird, hinzugefügt) werden sollen. Zusätzlich wird das Signal, das den Handler ausgelöst hat,
blockiert, falls nicht der Schalter SA_NODEFER verwandt wurde.
sa_flags legt eine Gruppe von Schaltern fest, die das Verhalten des Signals verändern. Es wird durch
bitweise ODER-Verknüpfung von Null oder mehreren der folgenden Werte erstellt:
SA_NOCLDSTOP
Falls signum SIGCHLD ist, werden keine Benachrichtigungen empfangen, wenn ein Kindprozess gestoppt
(d.h. wenn es SIGSTOP, SIGTSTP, SIGTTIN oder SIGTTOU empfängt) oder wiederaufgenommen wird (d.h.
es SIGCONT empfängt) (siehe wait(2)). Dieser Schalter ist nur bei der Einrichtung eines Handlers
für SIGCHLD von Bedeutung.
SA_NOCLDWAIT (seit Linux 2.6)
Falls signum SIGCHLD ist, Kinder nicht beim Beenden in Zombies umwandeln. Siehe auch waitpid(2).
Dieser Schalter ist nur beim Aufbau eines Handlers für SIGCHLD von Bedeutung oder wenn die
Zuordnung dieses Signals zu SIG_DFL gesetzt wird.
Falls der Schalter SA_NOCLDWAIT beim Einrichten eines Handlers für SIGCHLD gesetzt ist, lässt es
POSIX.1 unspezifiziert, ob ein Signal SIGCHLD generiert wird, wenn sich ein Kindprozess beendet.
Unter Linux wird in diesem Fall ein Signal SIGCHLD generiert, bei einigen anderen
Implementierungen passiert das nicht.
SA_NODEFER
Fügt das Signal nicht zu der Signalmaske des Threads hinzu, während der Handler ausgeführt wird,
außer das Signal ist in act.sa_mask festgelegt. Folgerichtig kann eine weitere Instanz des Signals
an den Thread ausgeliefert werden, während er den Handler ausführt. Dieser Schalter ist nur beim
Aufbau eines Signal-Handlers von Bedeutung.
SA_NOMASK ist ein veraltetes, nicht standardisiertes Synonym für diesen Schalter.
SA_ONSTACK
Den Signal-Handler auf einen alternativen, durch sigaltstack(2) bereitgestellten Signal-Stack
aufrufen. Falls kein alternativer Stack verfügbar ist, wird der Standard-Stack verwandt. Dieser
Schalter ist nur beim Aufbau eines Signal-Handlers von Bedeutung.
SA_RESETHAND
Stellt die Signalaktion beim Eintritt in den Signal-Handler auf den Vorgabewert zurück. Dieser
Schalter ist nur bei der Einrichtung eines Handlers von Bedeutung.
SA_ONESHOT ist ein veraltetes, nicht standardisiertes Synonym für diesen Schalter.
SA_RESTART
Stellt ein zur BSD-Signalsemantik kompatibles Verhalten her, indem bestimmte Systemaufrufe über
Signale hinweg neu gestartet werden können. Dieser Schalter ist nur bei der Einrichtung eines
Handlers von Bedeutung. Siehe signal(7) für eine Diskussion bezüglich des Neustarts von
Systemaufrufen.
SA_RESTORER
Nicht für die Verwendung von Anwendungen gedacht. Dieser Schalter wird von C-Bibliotheken
verwandt, um anzuzeigen, dass das Feld sa_restorer die Adresse eines »Signaltrampolins« enthält.
Siehe sigreturn(2) für weitere Details.
SA_SIGINFO (seit Linux 2.2)
Der Signal-Handler erwartet drei Argumente, nicht eines. In diesem Fall sollte sa_sigaction auf
sa_handler gesetzt werden. Dieser Schalter ist nur bei der Einrichtung eines Handlers von
Bedeutung.
SA_UNSUPPORTED (seit Linux 5.11)
Wird zum dynamischen Testen für Schalter-Bit-Unterstützung verwandt.
Falls ein Versuch, einen Handler mit diesem gesetzten Schalter zu registrieren erfolgreich ist,
wobei dieser Schalter in act->sa_flags zusammen mit anderen Schaltern, die möglicherweise vom
Kernel nicht unterstützt werden, gesetzt ist und ein sofort folgender Aufruf von sigaction(), der
die gleiche Signalnummer und mit einem von NULL verschiedenen Argument oldact hat, SA_UNSUPPORTED
clear in oldact->sa_flags ergibt, dann kann oldact->sa_flags als Bitmaske verwandt werden, welche
der möglicherweise nicht unterstützten Schalter tatsächlich unterstützt werden. Siehe den
Abschnitt »Dynamisches Ermitteln für Schalter-Bit-Unterstützung« für weitere Details.
SA_EXPOSE_TAGBITS (seit Linux 5.11)
Normalerweise wird beim Ausliefern eines Signals eine architekturabhängige Gruppe von
Markierungsbits aus dem Feld si_addr von siginfo_t bereinigt. Falls dieser Schalter gesetzt ist,
wird eine architekturabhängige Teilgruppe der Markierungsbits in si_addr erhalten.
Programme, die mit Linux-Versionen älter als 5.11 kompatibel sein müssen, müssen SA_UNSUPPORTED
zur Ermittlung der Unterstützung verwenden.
Das Argument siginfo_t eines SA_SIGINFO-Handlers
Wenn der Schalter SA_SIGINFO in act.sa_flags angegeben wird, wird die Adresse des Signal-Handlers über
das Feld act.sa_sigaction übergeben. Dieser Handler akzeptiert drei Argumente wie folgt:
void
handler(int sig, siginfo_t *info, void *ucontext)
{
...
}
Die Bedeutung der drei Argumente im Einzelnen:
sig Die Anzahl der Signale, die den Aufruf des Handlers hervorriefen.
info Ein Zeiger auf ein siginfo_t. Dies ist eine Struktur, die weitere Informationen, wie unten
beschrieben, über das Signal enthält.
ucontext
Dies ist ein Zeiger auf eine Struktur ucontext_t, typenumgewandelt auf void *. Die Struktur, auf
die von diesem Feld gezeigt wird, enthält Signalkontextinformationen, die vom Benutzerraum-Stack
durch den Kernel gespeichert wurden; für Details siehe sigreturn(2). Weitere Informationen über
die Struktur ucontext_t können in getcontext(3) und signal(7) gefunden werden. Typischerweise
verwendet die Handler-Funktion das dritte Argument nicht.
Der Datentyp siginfo_t ist eine Struktur mit den folgenden Feldern:
siginfo_t {
int si_signo; /* Signalnummer */
int si_errno; /* Ein Errno-Wert */
int si_code; /* Signal-Code */
int si_trapno; /* Ausnahmebehandlungsnummer die das Hardware-
gestüzte Signal hervorrief
(auf den meisten Architekturen unbenutzt) */
pid_t si_pid; /* Senden der Prozesskennung */
uid_t si_uid; /* Echte Benutzerkennung des sendenden Prozesses */
int si_status; /* Exit-Wert oder -Signal */
clock_t si_utime; /* Verbrauchte Benutzerzeit */
clock_t si_stime; /* Verbrauchte Systemzeit */
union sigval si_value; /* Signalwert */
int si_int; /* POSIX.1b-Signal */
void *si_ptr; /* POSIX.1b-Signal */
int si_overrun; /* Timer-Überlaufzähler;
POSIX.1b-Timer */
int si_timerid; /* Timer-Kennung; POSIX.1b-Timer */
void *si_addr; /* Speicherort, der die Ausnahmebehnadlung auslöste */
long si_band; /* Bandeereignis (war int in
Glibc 2.3.2 und älter) */
int si_fd; /* Dateideskriptor */
short si_addr_lsb; /* Niedrigstes Bit der Adresse
(seit Linux 2.6.32) */
void *si_lower; /* Untere Grenze bei Adresssverletzung
aufgetreten (seit Linux 3.19) */
void *si_upper; /* Obere Grenze bei Adresssverletzung
aufgetreten (seit Linux 3.19) */
int si_pkey; /* Schutzschlüssel auf PTE der die
Ausnahmebehandlung auslöste (seit Linux 4.6) */
void *si_call_addr; /* Adresse der Systemaufrufanweisung
(seit Linux 3.5) */
int si_syscall; /* Nummer des versuchten Systemaufrufs
(seit Linux 3.5) */
unsigned int si_arch; /* Architektur des versuchten Systemaufrufs
(seit Linux 3.5) */
}
si_signo, si_errno und si_code sind für alle Signale definiert. (si_errno ist im Allgemeinen unter Linux
unbenutzt). Der Rest der Struktur kann eine Union sein, daher sollten nur die Felder ausgelesen werden,
die für das übergebene Signal von Bedeutung sind:
• Signale, die mit kill(2) und sigqueue(3) gesandt werden, füllen si_pid und si_uid aus. Zusätzlich
füllen Signale, die mit sigqueue(3) gesandt werden, si_int und si_ptr mit den vom Sender angegebenen
Werten aus. Siehe sigqueue(3) für weitere Details.
• Signale, die von POSIX.1b-Timern gesendet werden (seit Linux 2.6), füllen si_overrun und si_timerid.
Das Feld si_timerid ist eine interne Kennung, die vom Kernel zur Identifikation des Timers benutzt
wurde, sie ist nicht mit der durch timer_create(2) zurückgelieferten Kennung identisch. Das Feld
si_overrun ist der Timer-Überlaufzähler. Dies ist die gleiche Information, wie sie durch einen Aufruf
von timer_getoverrun(2) erhalten wird. Diese Felder sind nicht standardisierte Linux-Erweiterungen.
• Signale, die der Nachrichtenbenachrichtigungswarteschlange gesandt werden (siehe die Beschreibung von
SIGEV_SIGNAL in mq_notify(3)), füllen si_int/si_ptr, wobei sigev_value für mq_notify(3) bereitgestellt
wird, si_pid mit der Prozesskennung des Absenders und si_uid mit der realen Benutzerkennung des
Nachrichtensenders.
• SIGCHLD füllt si_pid, si_uid, si_status, si_utime und si_stime mit Informationen über das Kind aus.
Das Feld si_pid ist die Prozesskennung des Kindes; si_uid ist die reale Benutzerkennung. Das Feld
si_status enthält den Exit-Status des Kindes (falls si_code CLD_EXITED ist) oder die Signalnummer, die
den Prozess zur Zustandsänderung veranlasst hat. si_utime und si_stime enthalten die vom Kindprozess
verwandte Benutzer- und System-CPU-Zeit, diese Felder enthalten nicht die Zeit von Kindern, auf die
gewartet wurde (anders als getrusage(2) und times(2)). Bis Linux 2.6 und seit Linux 2.6.27 berichten
diese Felder die CPU-Zeit in Einheiten von sysconf(_SC_CLK_TCK). In Linux 2.6er-Kerneln vor Linux
2.6.27 wurden durch einen Fehler diese Felder in Einheiten der (konfigurierbaren) System-Jiffys
berichtet (siehe time(7)).
• SIGILL, SIGFPE, SIGSEGV, SIGBUS und SIGTRAP füllen in si_addr die Adresse der Ausnahmebehandlung ein.
Auf einigen Architekturen werden diese Signale auch in das Feld si_trapno eingefüllt.
Einige Unterfehler von SIGBUS, insbesondere BUS_MCEERR_AO und BUS_MCEERR_AR, füllen auch si_addr_lsb
aus. Dieses Feld zeigt die niedrigste Bit der berichteten Adresse and und somit die größe der
Beschädigung. Wurde beispielsweise eine ganze Seite beschädigt, enthält si_addr_lsb contains
log2(sysconf(_SC_PAGESIZE)). Wenn SIGTRAP als Antwort auf ein ptrace(2)-Ereignis (PTRACE_EVENT_foo)
geliefert wird, dann wird si_addr nicht gefüllt, aber si_pid und si_uid werden mit der respektiven
Prozesskennung und Benutzerkennung, die für das Ausliefern der Ausnahmebehandlung verantwortlich sind,
gefüllt. Im Falle von seccomp(2) wird das nachverfolgte Programm (»Tracee«) als Auslieferer des
Ereignisses angezeigt. BUS_MCEERR_* and si_addr_lsb sind Linux-spezifische Erweiterungen.
Der Unterfehler SEGV_BNDERR von SIGSEGV belegt si_lower und si_upper.
Der Unterfehler SEGV_PKUERR von SIGSEGV belegt si_pkey.
• SIGIO/SIGPOLL (die zwei Namen sind unter Linux synonym) füllen si_band und si_fd aus. Das Ereignis
si_band ist eine Bitmaske, die die gleichen Werte enthält, die auch durch poll(2) in das Feld revents
eingetragen werden. Das Feld si_fd zeigt den Dateideskriptor an, für den ein E/A-Ereignis aufgetreten
ist. Für weitere Details lesen Sie die Beschreibung von F_SETSIG in fcntl(2).
• SIGSYS, erstellt (seit Linux 3.5) wenn ein Seccomp-Filter SECCOMP_RET_TRAP zurückliefert, füllt
si_call_addr, si_syscall, si_arch, si_errno und andere Felder wie in seccomp(2) beschrieben aus.
Das Feld si_code
Das Feld si_code innerhalb des an den Signal-Handler SA_SIGINFO übergebenen Arguments siginfo_t ist ein
Wert (keine Bitmaske), der angibt, warum dieses Signal gesendet wurde. Für ein ptrace(2)-Ereignis wird
si_code SIGTRAP enthalten und das Ptrace-Ereignis im hohen Byte enthalten.
(SIGTRAP | PTRACE_EVENT_foo << 8).
Für ein Ereignis außerhalb von ptrace(2) sind die Werte, die in si_code erscheinen können, im Rest dieses
Abschnittes beschrieben. Seit Glibc 2.20 werden die Definitionen der meisten dieser Symbole aus
<signal.h> erhalten, indem Feature-Test-Makros (vor dem Einbinden irgendeiner Header-Datei) wie folgt
definiert werden:
• _XOPEN_SOURCE mit dem Wert 500 oder größer;
• _XOPEN_SOURCE und _XOPEN_SOURCE_EXTENDED; oder
• _POSIX_C_SOURCE mit einem Wert 200809L oder größer.
Für die Konstanten TRAP_* werden die Symboldefinitionen nur in den ersten zwei Fällen bereitgestellt. Vor
Glibc 2.20 wurde kein Feature-Test-Makro zum Erhalt dieser Symbole benötigt.
Für ein reguläres Signal zeigt die folgende Liste die Werte, die in si_code für jedes Signal gelegt
werden können, zusammen mit dem Grund für die Erstellung des Signals.
SI_USER
kill(2)
SI_KERNEL
Vom Kernel geschickt
SI_QUEUE
sigqueue(3)
SI_TIMER
POSIX-Timer ausgelaufen
SI_MESGQ (seit Linux 2.6.6)
POSIX-Nachrichtenwarteschlangenstatus geändert; siehe mq_notify(3).
SI_ASYNCIO
AIO abgeschlossen
SI_SIGIO
SIGIO in die Warteschlange eingereiht (nur bis Linux 2.2; seit Linux 2.4 füllt wie unten
beschrieben SIGIO/SIGPOLL in si_code).
SI_TKILL (seit Linux 2.4.19)
tkill(2) oder tgkill(2)
Die folgenden Werte können in si_code für ein Signal SIGILL gesetzt werden:
ILL_ILLOPC
Ungültiger Opcode
ILL_ILLOPN
Ungültiger Operand
ILL_ILLADR
Ungültiger Adressierungsmodus
ILL_ILLTRP
Ungültige Ausnahmebehandlung.
ILL_PRVOPC
Privilegierter Opcode
ILL_PRVREG
Privilegiertes Register
ILL_COPROC
Koprozessorfehler
ILL_BADSTK
Interner Stack-Fehler
Die folgenden Werte können in si_code für ein Signal SIGFPE gesetzt werden:
FPE_INTDIV
Ganzzahldivision durch Null
FPE_INTOVF
Ganzzahlüberlauf
FPE_FLTDIV
Fließkommadivision durch Null
FPE_FLTOVF
Fließkommazahlüberlauf
FPE_FLTUND
Fließkommazahlunterlauf
FPE_FLTRES
Ungenaues Fließkommaergebnis
FPE_FLTINV
Ungültige Fließkommazahlaktion
FPE_FLTSUB
Index außerhalb des Bereichs
Die folgenden Werte können in si_code für ein Signal SIGSEGV gesetzt werden:
SEGV_MAPERR
Adresse ist keinem Objekt zugeordnet.
SEGV_ACCERR
Ungültige Berechtigungen für zugeordnetes Objekt.
SEGV_BNDERR (seit Linux 3.19)
Adressgrenzenprüfung fehlgeschlagen
SEGV_PKUERR (seit Linux 4.6)
Zugriff wurde durch Speicherschutzschlüssel verweigert. Siehe pkeys(7). Der auf diesen Zugriff
passende Schutzschlüssel ist in si_pkey verfügbar.
Die folgenden Werte können in si_code für ein Signal SIGBUS gesetzt werden:
BUS_ADRALN
Ungültige Adressausrichtung.
BUS_ADRERR
Nichtexistierende physische Adresse.
BUS_OBJERR
Objektspezifischer Hardwarefehler.
BUS_MCEERR_AR (seit Linux 2.6.32)
Hardware-Speicherfehler wurde in einem Maschinen-Check verarbeitet; Aktion notwendig.
BUS_MCEERR_AO (seit Linux 2.6.32)
Hardwarespeicherfehler im Prozess erkannt aber nicht verwendet; Aktion optional.
Die folgenden Werte können in si_code für ein Signal SIGTRAP gesetzt werden:
TRAP_BRKPT
Prozess-Unterbrechungspunkt
TRAP_TRACE
Prozessnachverfolgungsausnahmebehandlung.
TRAP_BRANCH (seit Linux 2.4, nur IA64)
Prozess hat die Ausnahmebehandlung des Zweiges genommen.
TRAP_HWBKPT (seit Linux 2.4, nur IA64)
Hardware-Unterbrechungs-/Überwachungspunkt.
Die folgenden Werte können in si_code für ein Signal SIGCHLD gesetzt werden:
CLD_EXITED
Kind hat sich beendet.
CLD_KILLED
Kind wurde getötet
CLD_DUMPED
Kind wurde anormal beendet.
CLD_TRAPPED
Das nachverfolgte Kind kam in eine Ausnahmebehandlung.
CLD_STOPPED
Kind wurde gestoppt.
CLD_CONTINUED (seit Linux 2.6.9)
Gestopptes Kind hat fortgefahren.
Die folgenden Werte können in si_code für ein Signal SIGIOSIGPOLL gesetzt werden:
POLL_IN
Dateneingabe verfügbar
POLL_OUT
Ausgabepuffer verfügbar
POLL_MSG
Eingabenachricht verfügbar
POLL_ERR
E/A-Fehler (engl. I/O).
POLL_PRI
Eingabe hoher Priorität verfügbar
POLL_HUP
Gerät abgetrennt
Die folgenden Werte können in si_code für ein Signal SIGSYS gesetzt werden:
SYS_SECCOMP (seit Linux 3.5)
Ausgelöst durch eine seccomp(2)-Filterregel.
Dynamisches Ermitteln für Schalter-Bit-Unterstützung
Unter Linux akzeptiert der Aufruf sigaction() ohne Fehler unbekannte Bits, die in act->sa_flags gesetzt
sind. Beginnend mit Linux 5.11 ist das Verhalten, dass ein zweiter Aufruf von sigaction() unbekannte Bits
aus oldact->sa_flags bereinigen wird. Allerdings würde historisch ein zweiter Aufruf von sigaction()
diese Bits in oldact->sa_flags gesetzt lassen.
Das bedeutet, dass die Unterstützung für neue Schalter nicht einfach dadurch erkannt werden kann, indem
auf einen Schalter in sa_flags getestet wird und ein Programm muss testen, dass SA_UNSUPPORTED bereinigt
wurde, beovr es sich auf die Inhalte von sa_flags verlassen kann.
Da das Verhalten des Signal-Handlers nicht garantiert werden kann, außer diese Prüfung war erfolgreich,
ist es Weise, entweder das betroffene Signal zu blockieren, während der Handler registriert wird und in
diesem Fall die Prüfung durchzuführen, oder, wo das nicht möglich ist, beispielsweise falls das Signal
synchron ist, einen zweiten sigaction() im Signal-Handler selbst auszulösen.
Bei Kerneln, die einen bestimmten Schalter nicht unterstützen, verhält sich der Kernel so, als ob der
Schalter nicht gesetzt worden wäre, selbst wenn der Schalter in act->sa_flags gesetzt wurde.
Die Schalter SA_NOCLDSTOP, SA_NOCLDWAIT, SA_SIGINFO, SA_ONSTACK, SA_RESTART, SA_NODEFER, SA_RESETHAND
und, falls durch die Architektur definiert, SA_RESTORER können nicht zuverlässig mittels dieses
Mechanismus erkannt werden, da sie vor Linux 5.11 eingeführt wurden. Allerdings können Programme im
Allgemeinen annehmen, dass diese Schalter unterstüzt werden, da sie alle seit Linux 2.6, das im Jahr 2003
veröffentlicht wurde, unterstützt werden.
Siehe nachfolgende BEISPIELE für eine Vorstellung des Einsatzes von SA_UNSUPPORTED.
RÜCKGABEWERT
sigaction() gibt bei Erfolg Null zurück. Bei einem Fehler wird -1 zurückgegeben und errno entsprechend
gesetzt.
FEHLER
EFAULT akt oder altakt zeigt aus dem vom Prozess adressierbaren Adressraum heraus.
EINVAL Ein ungültiges Signal wurde angegeben. Dieser Fehler wird auch ausgelöst, wenn versucht wird, die
Aktion für SIGKILL oder SIGSTOP zu ändern, da diese nicht abgefangen oder ignoriert werden können.
VERSIONEN
Unterschiede C-Bibliothek/Kernel
Die Glibc-Wrapper-Funktion für sigaction() liefert bei Versuchen, die Zuordnung der zwei intern durch die
NPTL-Threading-Implementierung verwandten Echtzeitsignale zu ändern, einen Fehler zurück. Siehe nptl(7)
für Details.
Auf Architekturen, bei denen das Signal-Trampolin innerhalb der C-Bibliothek liegt, setzt die
Glibc-Wrapper-Funktion für sigaction() die Adresse des Trampolin-Codes in das Feld act.sa_restorer und
SA_RESTORER in das Feld act.sa_flags. Siehe sigreturn(2).
Der ursprüngliche Linux-Systemaufruf hieß sigaction(). Mit dem Hinzufügen von Echtzeitsignalen in Linux
2.2 passte der mit einer festen Größe versehene 32-Bit-Typ sigset_t nicht mehr für den Zweck. Daher wurde
ein neuer Systemaufruf rt_sigaction() mit einem vergrößerten Typ sigset_t hinzugefügt. Der neue
Systemaufruf akzeptiert ein viertes Argument size_t sigsetsize, das die Größe in Bytes der Signalgruppe
in act.sa_mask und oldact.sa_mask festlegt. Dieses Argument muss derzeit den Wert sizeof(sigset_t)
enthalten oder der Fehler EINVAL tritt auf. Die Glibc-Wrapper-Funktion sigaction() versteckt diese
Details und ruft rt_sigaction() transparent auf, wenn der Kernel ihn bereitstellt.
STANDARDS
POSIX.1-2008.
GESCHICHTE
POSIX.1-2001, SVr4.
POSIX.1-1990 verbot das Setzen der Aktion für SIGCHLD bis SIG_IGN. POSIX.1-2001 und neuer erlauben diese
Möglichkeit, so dass das Ignorieren von SIGCHLD zur Vermeidung von Zombies verwandt werden kann (siehe
wait(2)). Allerdings unterscheiden sich die historischen BSD- und System-V-Verhalten für das Ignorieren
von SIGCHLD, so dass die einzige komplett portable Methode, um sicherzustellen, dass beendete Kinder
nicht Zombies werden, das Fangen des Signals SIGCHLD und das Durchführen eines wait(2) oder ähnlichem
ist.
POSIX.1-1990 spezifizierte nur SA_NOCLDSTOP. POSIX.1-2001 fügte SA_NOCLDWAIT, SA_NODEFER, SA_ONSTACK,
SA_RESETHAND, SA_RESTART und SA_SIGINFO als XSI-Erweiterungen hinzu. POSIX.1-2008 schob SA_NODEFER,
SA_RESETHAND, SA_RESTART und SA_SIGINFO in die Basis-Spezifikation. Benutzung letzterer Werte in sa_flags
könnte in Anwendungen, die für ältere UNIX-Implementierungen gedacht sind, weniger portabel sein.
Der Schalter SA_RESETHAND ist zu dem SVr4-Schalter mit dem gleichen Namen kompatibel.
Der Schalter SA_NODEFER ist mit dem SVr4-Schalter des gleichen Namens unter Kerneln 1.3.9 und neuer
kompatibel. Unter älteren Kerneln erlaubte die Linux-Implementierung nicht das Empfangen irgendeines
Signals, nicht nur desjenigen, das installiert wurde (was effektiv die Einstellungen sa_mask außer Kraft
setzt).
ANMERKUNGEN
Ein mittels fork(2) erstellter Kindprozess erbt eine Kopie der Signalzuordnungen seines Elternprozesses.
Während eines execve(2) werden die Zuordnungen von verwalteten Signalen auf die Vorgabe zurückgesetzt;
die Zuordnung ignorierter Signale werden unverändert gelassen.
Laut POSIX ist das Verhalten eines Prozesses undefiniert, nachdem er ein Signal SIGFPE, SIGILL oder
SIGSEGV ignoriert hat, das nicht von kill(2) oder raise(3) erstellt wurde. Ganzzahldivision durch Null
hat ein undefiniertes Ergebnis. Auf einigen Architekturen wird dies ein Signal SIGFPE hervorrufen. (Auch
kann die Division der größten negativen Ganzzahl durch -1 SIGFPE hervorrufen.) Wird dieses Signal
ignoriert, kann eine Endlosschleife auftreten.
Wird sigaction mit NULL als zweitem Argument aufgerufen, kann der augenblickliche Signal-Handler
abgefragt werden. Die Funktion kann auch dazu benutzt werden, die Gültigkeit eines Signales für die
aktuelle Maschine zu überprüfen, indem sie mit NULL als zweitem und drittem Argument aufgerufen wird.
Es ist nicht möglich, SIGKILL oder SIGSTOP zu blockieren (indem sie in sa_mask festgelegt werden).
Derartige Versuche werden ohne Rückmeldung ignoriert.
Siehe sigsetops(3) für Details über das Bearbeiten von Signalgruppen.
Siehe signal-safety(7) für eine Liste der asynchron-signalsicheren Funktionen, die sicher innerhalb eines
Signal-Handlers aufgerufen werden können.
Undokumentiert
Vor der Einführung von SA_SIGINFO war es auch möglich, einige zusätzliche Informationen über das Signal
zu erhalten. Dies erfolgte durch Bereitstellung eines sa_handler-Signal-Handlers mit einem zweiten
Argument des Typs struct sigcontext, das die gleiche Struktur ist, wie jene, die im Feld uc_mcontext der
Struktur ucontext übergeben wird, die wiederum (mittels eines Zeigers) als drittes Argument des Handlers
sa_sigaction übergeben wird. Siehe die relevanten Kernelquellen für Details. Diese Verwendung ist jetzt
veraltet.
FEHLER
Wird ein Signal mit einem SA_SIGINFO-Handler ausgeliefert, stellt der Kernel nicht immer aussagekräftige
Werte für alle Felder von siginfo_t, die relevant für dieses Signal sind, bereit.
In Linux bis einschließlich 2.6.13 verhinderte die Festlegung von SA_NODEFER in sa_flags nicht nur die
Ausblendung des ausgelieferten Signals während der Ausführung des Handlers sondern auch der in sa_mask
festgelegten Signale. Dieser Fehler wurde in Linux 2.6.14 behoben.
BEISPIELE
Siehe mprotect(2)
Ermitteln von Schalter-Unterstützung
Das nachfolgende Beispielprogramm beendet sich mit dem Status EXIT_SUCCESS falls bestimmt wird, dass
SA_EXPOSE_TAGBITS unterstützt wird, und andernfalls mit EXIT_FAILURE.
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void
handler(int signo, siginfo_t *info, void *context)
{
struct sigaction oldact;
if (sigaction(SIGSEGV, NULL, &oldact) == -1
|| (oldact.sa_flags & SA_UNSUPPORTED)
|| !(oldact.sa_flags & SA_EXPOSE_TAGBITS))
{
_exit(EXIT_FAILURE);
}
_exit(EXIT_SUCCESS);
}
int
main(void)
{
struct sigaction act = { 0 };
act.sa_flags = SA_SIGINFO | SA_UNSUPPORTED | SA_EXPOSE_TAGBITS;
act.sa_sigaction = &handler;
if (sigaction(SIGSEGV, &act, NULL) == -1) {
perror("sigaction");
exit(EXIT_FAILURE);
}
raise(SIGSEGV);
}
SIEHE AUCH
kill(1), kill(2), pause(2), pidfd_send_signal(2), restart_syscall(2), seccomp(2), sigaltstack(2),
signal(2), signalfd(2), sigpending(2), sigprocmask(2), sigreturn(2), sigsuspend(2), wait(2), killpg(3),
raise(3), siginterrupt(3), sigqueue(3), sigsetops(3), sigvec(3), core(5), signal(7)
ÜBERSETZUNG
Die deutsche Übersetzung dieser Handbuchseite wurde von René Tschirley <gremlin@cs.tu-berlin.de>, Martin
Eberhard Schauer <Martin.E.Schauer@gmx.de> und Helge Kreutzmann <debian@helgefjell.de> erstellt.
Diese Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer
bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.
Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die
Mailingliste der Übersetzer: debian-l10n-german@lists.debian.org.
Linux man-pages 6.9.1 2. Mai 2024 sigaction(2)