Provided by: manpages-de-dev_4.27.0-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 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)