Provided by: manpages-de-dev_4.15.0-9_all bug

BEZEICHNUNG

       sigaction, rt_sigaction - Signalaktionen untersuchen und ändern

ÜBERSICHT

       #include <signal.h>

       int sigaction(int signum, const struct sigaction *restrict akt,
                     struct sigaction *restrict altakt);

   Mit Glibc erforderliche 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  ist  eine  der
       folgenden:

       * 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)).  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  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 in Kerneln 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.

KONFORM ZU

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

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.

       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 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.

   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.

   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 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.

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 <stdlib.h>
       #include <stdio.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)

KOLOPHON

       Diese  Seite  ist  Teil  der  Veröffentlichung  5.13  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 ⟨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⟩.