DOKK / manpages / debian 10 / manpages-de-dev / sigaction.2.de
SIGACTION(2) Linux-Programmierhandbuch SIGACTION(2)

sigaction, rt_sigaction - Signalaktionen untersuchen und ändern

ÜBERSICHT

#include <signal.h>
int sigaction(int signum, const struct sigaction *act,
              struct sigaction *oldact);


Mit Glibc erforderliche Makros (siehe feature_test_macros(7)):

sigaction(): _POSIX_C_SOURCE

siginfo_t: _POSIX_C_SOURCE >= 199309L

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 act nicht NULL ist, wird die neue Aktion für Signal signum aus act installiert. Falls oldact nicht Null ist, wird die vorherige Aktion in oldact 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 legt die signum zugeordnete Funktion fest; sie könnte SIG_DFL als Vorgabeaktion sein, SIG_IGN, um dieses Signal zu ignorieren oder ein Zeiger auf eine Signalhandhabungsfunktion. Diese Funktion erhält die Signalnummer als 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:

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.
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.
Es wird nicht verhindert, dass das Signal innerhalb seines eigenen Signal-Handlers empfangen wird. Dieser Schalter ist nur bei der Einrichtung eines Handlers von Bedeutung. SA_NOMASK ist ein veraltetes, nicht standardisiertes Synonym für diesen Schalter.
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.
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.
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.
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.
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.

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:

Die Anzahl der Signale, die den Aufruf des Handlers hervorriefen.
Ein Zeiger auf ein siginfo_t. Dies ist eine Struktur, die weitere Informationen, wie unten beschrieben, über das Signal enthält.
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) 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; /* Signal number */
int si_errno; /* An errno value */
int si_code; /* Signal code */
int si_trapno; /* Trap number that caused
hardware-generated signal
(unused on most architectures) */
pid_t si_pid; /* Sending process ID */
uid_t si_uid; /* Real user ID of sending process */
int si_status; /* Exit value or signal */
clock_t si_utime; /* User time consumed */
clock_t si_stime; /* System time consumed */
sigval_t si_value; /* Signal value */
int si_int; /* POSIX.1b signal */
void *si_ptr; /* POSIX.1b signal */
int si_overrun; /* Timer overrun count;
POSIX.1b timers */
int si_timerid; /* Timer ID; POSIX.1b timers */
void *si_addr; /* Memory location which caused fault */
long si_band; /* Band event (was int in
glibc 2.3.2 and earlier) */
int si_fd; /* File descriptor */
short si_addr_lsb; /* Least significant bit of address
(since Linux 2.6.32) */
void *si_lower; /* Lower bound when address violation
occurred (since Linux 3.19) */
void *si_upper; /* Upper bound when address violation
occurred (since Linux 3.19) */
int si_pkey; /* Protection key on PTE that caused
fault (since Linux 4.6) */
void *si_call_addr; /* Address of system call instruction
(since Linux 3.5) */
int si_syscall; /* Number of attempted system call
(since Linux 3.5) */
unsigned int si_arch; /* Architecture of attempted system call
(since 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)). In Kerneln bis 2.6 und seit 2.6.27 berichten diese Felder die CPU-Zeit in Einheiten von sysconf(_SC_CLK_TCK). In 2.6er Kerneln vor 2.6.27 wurden durch einen Fehler diese Felder in Einheiten der (konfigurierbaren) System-Jiffys berichtet (siehe time(7)).
  • SIGILL, SIGFPE, SIGSEGV, SIGBUS, and SIGTRAP fill in si_addr with the address of the fault. On some architectures, these signals also fill in the si_trapno field.
Some suberrors of SIGBUS, in particular BUS_MCEERR_AO and BUS_MCEERR_AR, also fill in si_addr_lsb. This field indicates the least significant bit of the reported address and therefore the extent of the corruption. For example, if a full page was corrupted, si_addr_lsb contains log2(sysconf(_SC_PAGESIZE)). When SIGTRAP is delivered in response to a ptrace(2) event (PTRACE_EVENT_foo), si_addr is not populated, but si_pid and si_uid are populated with the respective process ID and user ID responsible for delivering the trap. In the case of seccomp(2), the tracee will be shown as delivering the event. BUS_MCEERR_* and si_addr_lsb are Linux-specific extensions.
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 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.

kill(2)
Vom Kernel geschickt
sigqueue(3)
POSIX-Timer ausgelaufen
POSIX-Nachrichtenwarteschlangenstatus geändert; siehe mq_notify(3).
AIO abgeschlossen
SIGIO in die Warteschlange eingereiht (nur in Kerneln bis Linux 2.2; seit Linux 2.4 füllt wie unten beschrieben SIGIO/SIGPOLL in si_code).
tkill(2) oder tgkill(2)

Die folgenden Werte können in si_code für ein Signal SIGILL gesetzt werden:

Ungültiger Opcode
Ungültiger Operand
Ungültiger Adressierungsmodus
Illegal trap.
Privilegierter Opcode
Privilegiertes Register
Koprozessorfehler
Interner Stack-Fehler

Die folgenden Werte können in si_code für ein Signal SIGFPE gesetzt werden:

Ganzzahldivision durch Null
Ganzzahlüberlauf
Fließkommadivision durch Null
Fließkommazahlüberlauf
Fließkommazahlunterlauf
Ungenaues Fließkommaergebnis
Ungültige Fließkommazahlaktion
Index außerhalb des Bereichs

Die folgenden Werte können in si_code für ein Signal SIGSEGV gesetzt werden:

Address not mapped to object.
Invalid permissions for mapped object.
Adressgrenzenprüfung fehlgeschlagen
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:

Ungültige Adressausrichtung.
Nichtexistierende physische Adresse.
Objektspezifischer Hardwarefehler.
Hardware memory error consumed on a machine check; action required.
Hardwarespeicherfehler im Prozess erkannt aber nicht verwendet; Aktion optional.

Die folgenden Werte können in si_code für ein Signal SIGTRAP gesetzt werden:

Prozess-Unterbrechungspunkt
Process trace trap.
Process taken branch trap.
Hardware-Unterbrechungs-/Überwachungspunkt.

Die folgenden Werte können in si_code für ein Signal SIGCHLD gesetzt werden:

Kind hat sich beendet.
Kind wurde getötet
Kind wurde anormal beendet.
Traced child has trapped.
Kind wurde gestoppt.
Gestopptes Kind hat fortgefahren.

Die folgenden Werte können in si_code für ein Signal SIGIOSIGPOLL gesetzt werden:

Dateneingabe verfügbar
Ausgabepuffer verfügbar
Eingabenachricht verfügbar
E/A-Fehler (engl. I/O).
Eingabe hoher Priorität verfügbar
Gerät abgetrennt

Die folgenden Werte können in si_code für ein Signal SIGSYS gesetzt werden:

Ausgelöst durch eine seccomp(2)-Filterregel.

sigaction() gibt bei Erfolg Null zurück. Bei einem Fehler wird -1 zurückgegeben und errno entsprechend gesetzt.

act oder oldact zeigt aus dem vom Prozess adressierbaren Adressraum heraus.
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.

POSIX.1-2001, POSIX.1-2008, SVr4.

Ein mittels fork(2) erstelltes Kind 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.

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_NOCLDSTOP, SA_NOCLDWAIT, SA_NODEFER, SA_ONSTACK, SA_RESETHAND, SA_RESTART und SA_SIGINFO hinzu. 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).

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 detaillierte Informationen über die Manipulation von Signalgruppen.

Siehe signal-safety(7) für eine Liste der asynchron-signalsicheren Funktionen, die sicher innerhalb eines Signal-Handlers aufgerufen werden können.

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.

Vor der Einführung von SA_SIGINFO war es auch möglich, einige zusätzliche Informationen durch die Verwendung eines sa_handler mit einem zweiten Argument des Typs struct sigcontext zu erhalten. Siehe die relevanten Kernelquellen für Details. Diese Verwendung ist jetzt veraltet.

In Kerneln 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 Kernel 2.6.14 behoben.

Siehe mprotect(2)

kill(1), kill(2), pause(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)

Diese Seite ist Teil der Veröffentlichung 4.16 des Projekts Linux-man-pages. Eine Beschreibung des Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden sich unter https://www.kernel.org/doc/man-pages/.

Ü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 <debian-l10n-german@lists.debian.org>.

15. September 2017 Linux