Provided by: manpages-de-dev_4.23.1-1_all bug

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 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ 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⟩.