Provided by: manpages-de_4.21.0-2_all bug

BEZEICHNUNG

       signal - Überblick über Signale (Software-Interrupts)

BESCHREIBUNG

       Linux  unterstützt  sowohl  nach  POSIX  zuverlässige  Signale  (im  Folgenden:  »Standard-Signale«)  und
       POSIX-Echtzeit-Signale.

   Signalzuordnung (disposition)
       Jedes Signal hat eine aktuelle Zuordnung. Sie legt fest, wie sich der Prozess verhält, wenn er das Signal
       erhält.

       Die Einträge in der »Aktion«-Spalte in der folgenden Tabelle legen die Standardzuordnung für jedes Signal
       fest:

       Term   Standardaktion ist der Abbruch des Prozesses.

       Ign    Standardaktion ist, das Signal zu ignorieren.

       Core   Die Standardaktion ist der Abbruch des Prozesses und das Erstellen  eines  Speicherauszugs  (siehe
              core(5)).

       Stop   Die Standardaktion ist, den Prozess anzuhalten.

       Cont   Die Standardaktion ist, einen angehaltenen Prozess fortzusetzen.

       Ein Prozess kann die Zuordnung eines Signals mit Hilfe von sigaction(2) oder signal(2) ändern. (Letzteres
       ist schlechter portierbar bei der Realisierung von Signal-Handlern; siehe  signal(2)  für  Details.)  Mit
       diesen  Systemaufrufen  kann  ein  Prozess  eine  der folgenden Verhaltensweisen bei Erhalt eines Signals
       auswählen: die Standardaktion ausführen, das Signal ignorieren oder das Signal mit  einem  Signal-Handler
       abfangen.  Ein  Signal-Handler  ist  eine  vom  Programmierer  definierte  Funktion. Sie wird automatisch
       aufgerufen, wenn das Signal eintrifft.

       Standardmäßig wird ein Signal-Handler auf dem normalen Prozess-Stack aufgerufen. Man kann es  einrichten,
       dass  der  Signal-Handler  einen alternativen Stack benutzt; vgl. sigaltstack(2) für eine Erörterung, wie
       das gemacht wird und wann es nützlich sein könnte.

       Die Signalzuordnung ist ein prozessbezogenes Attribut; in einer Multithread-Anwendung ist  die  Zuordnung
       eines bestimmten Signales für alle Threads gleich.

       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.

   Ein Signal senden
       Die  folgenden  Systemaufrufe  und Bibliotheksfunktionen ermöglichen dem aufrufenden Programm den Versand
       eines Signals:

       raise(3)
              sendet dem aufrufenden Thread ein Signal

       kill(2)
              sendet ein Signal an einen bestimmten Prozess, alle Mitglieder einer bestimmten Prozessgruppe oder
              an alle Prozesse im System

       pidfd_send_signal(2)
              sendet ein Signal an einen Prozess, der durch einen PID-Dateideskriptor identifiziert ist.

       killpg(3)
              sendet ein Signal an alle Mitglieder einer bestimmten Prozessgruppe

       pthread_kill(3)
              sendet ein Signal an einen bestimmten POSIX-Thread im gleichen Prozess wie die aufrufende Routine

       tgkill(2)
              Es  wird  ein  Signal an einen bestimmten Thread in einem bestimmten Prozess gesendet. (Mit diesem
              Systemaufruf wird pthread_kill(3) realisiert.)

       sigqueue(3)
              sendet ein Echtzeit-Signal und zugehörige Daten an einen bestimmten Prozess

   Warten auf ein abzufangendes Signal
       Die folgenden Systemaufrufe setzen die Ausführung des aufrufenden Threads aus, bis ein Signal  abgefangen
       wird (oder ein nicht abgefangenes Signal den Prozess beendet):

       pause(2)
              setzt die Ausführung aus, bis irgendein Signal abgefangen wird.

       sigsuspend(2)
              ändert  zeitweise  die Signalmaske (siehe unten) und setzt die Ausführung aus, bis eines der nicht
              maskierten Signale abgefangen wird.

   Synchrone Signalannahme
       Anstatt ein Signal  asynchron  mit  einem  Signal-Handler  abzufangen,  kann  ein  Signal  auch  synchron
       akzeptiert  werden.  Das heißt, die Ausführung wird blockiert, bis das Signal gesendet wird. Dann liefert
       der Kernel Informationen über das Signal an den Aufrufenden. Es gibt zwei allgemeine  Möglichkeiten,  das
       zu tun:

       •  sigwaitinfo(2),  sigtimedwait(2)  und  sigwait(3)  setzen  die Ausführung aus, bis ein Signal gesendet
          wird, dass zu einer festgelegen Gruppe von Signalen gehört. Jeder dieser  Aufrufe  gibt  Informationen
          über das empfangene Signal zurück.

       •  signalfd(2)  gibt  einen  Dateideskriptor  zurück.  Mit  ihm können Informationen über Signale gelesen
          werden, die dem Aufrufenden übermittelt werden.  Jeder  Aufruf  von  read(2)  aus  dieser  Datei  wird
          blockiert,  bis  eines  der  Signale  aus  der  im  Aufruf  von  signalfd(2) festgelegten Menge an den
          aufrufenden Prozess gesendet wird. Der von read(2) zurückgegebene Puffer enthält  eine  Struktur,  die
          das Signal beschreibt.

   Signalmaske und anstehende Signale
       Ein  Signal  kann  blockiert  werden.  Das  bedeutet,  dass  es  erst  dann  gesendet  wird,  nachdem  es
       (später/verzögert) freigegeben wurde. Zwischen dem Zeitpunkt seiner Erzeugung und  dem  Zeitpunkt  seines
       Versands wird es anstehend (pending) genannt.

       Jeder  Thread  in einem Prozess hat eine unabhängige Signalauswahl-Maske (signal mask). Sie legt den Satz
       von Signalen fest, den der Thread derzeit  blockiert.  Ein  Thread  kann  seine  Signalauswahl-Maske  mit
       pthread_sigmask(3)  manipulieren.  In  einer traditionellen Single-Threaded-Anwendung kann sigprocmask(2)
       verwendet werden, um die Signalmaske zu manipulieren.

       Ein mittels fork(2) erstellter Kindprozess erbt  eine  Kopie  der  Signalmaske  des  Elternprozeses;  die
       Signalmaske wird über execve(2) hinweg erhalten.

       Ein  Signal  kann  Prozess-orientiert  oder  Thread-orientiert  sein. Ein Prozess-orientiertes Signal ist
       eines, das auf einen Prozess als  gesamtes  zielt  (und  daher  daran  anhängig  ist).  Ein  Signal  kann
       Prozess-orientiert sein, da es vom Kernel für einen Grund außer einer Hardware-Ausnahmebehandlung erzeugt
       wurde oder da es mittels kill(2) oder sigqueue(3)  gesandt  wurde.  Ein  Thread-orientiertes  Signal  ist
       eines,  das  auf  einen  bestimmten  Thread  abzielt.  Ein  Signal kann Thread-orientiert sein, da es als
       Konsequenz einer Ausführung einer bestimmten Anweisung  in  Maschinensprache  erstellt  wurde,  die  eine
       Hardware-Ausnahmebehandlung  auslöste  (z.B. SIGSEGV für einen ungültigen Speicherzugriff oder SIGFPE für
       einen mathematischen Fehler) oder da es mit Schnittstellen wie tgkill(2) oder pthread_kill(3)  auf  einen
       bestimmten Thread zielte.

       Ein  Prozess-orientiertes Signal kann an jeden der Threads ausgeliefert werden, der derzeit keine Signale
       blockiert. Falls mehr als ein Thread Signale nicht blockiert, dann  wählt  der  Kernel  einen  beliebigen
       Thread aus, an den er das Signal ausliefert.

       Ein  Thread kann die aktuell für ihn anstehenden Gruppe von Signale mit sigpending(2) ermitteln. Das sind
       einerseits die für diesen Thread und andererseits die für seinen Prozess bestimmten Signale.

       Ein mittels fork(2) erstellter  Kindprozess  hat  anfänglich  eine  leere  anhängende  Signalgruppe;  die
       anhängende Signalgruppe wird über execve(2) hinweg erhalten.

   Ausführung eines Signal-Handlers
       Immer  wenn  es  einen Übergang von der Kernelmodus-Ausführung zu der Anwendungsraum-Ausführung gibt (z.B
       bei der Rückkehr aus einem Systemaufruf oder Einplanung eines Threads auf einer CPU), prüft  der  Kernel,
       ob  es ein anhängendes, nicht blockiertes Signal gibt, für das der Prozess einen Signal-Handler etabliert
       hat. Falls es ein solches anhängendes Signal gibt, passieren die folgenden Schritte:

       (1)  Der Kernel führt die notwendigen Vorbereitungsschritte zur Ausführung des Signal-Handlers durch:

            (1.1)  Das Signal wird aus der Menge der anhängenden Signale entfernt.

            (1.2)  Falls der Signal-Handler durch einen Aufruf  von  sigaction(2)  installiert  wurde,  der  den
                   Schalter   SA_ONSTACK   festlegte,   und  der  Thread  über  einen  definierten  alternativen
                   Signal-Stack verfügt (mittels sigaltstack(2)), dann wird der Stack installiert.

            (1.3)  Verschiedene Teile des Signal-bezogenen Kontextes werden in ein besonderes Frame gespeichert,
                   das auf dem Stack erstellt wird. Die gespeicherten Informationen beinhalten:

                   •  das  Programmzählregister  (d.h.  die Adresse der nächsten Anweisung in dem Hauptprogramm,
                      die ausgeführt werden soll, wenn der Signal-Handler zurückkehrt);

                   •  architekturabhängige Registerzustände, die zur Wiederaufnahme des unterbrochenen Programms
                      benötigt werden;

                   •  die aktuelle Signal-Maske des Threads;

                   •  die alternativen Signal-Stack-Einstellungen des Threads.

                   (Falls  der  Signal-Handler  mittels  des  Schalters  SA_SIGINFO von sigaction(2) installiert
                   wurde, dann kann auf die obigen Informationen über das Objekt ucontext_t, auf das  durch  das
                   dritte Argument des Signal-Handlers gezeigt wird, zugegriffen werden.)

            (1.4)  Jedes  bei  der  Registrierung  des  Handlers  mit sigprocmask(2) in act->sa_mask festgelegte
                   Signal wird zu der Signal-Maske des Threads hinzugefügt. Das auszuliefernde Signal wird  auch
                   zu  der  Signal-Maske  hinzugefügt, außer SA_NODEFER wurde bei der Registrierung des Handlers
                   festgelegt. Diese Signale sind daher während der Ausführung des Handlers blockiert.

       (2)  Der Kernel konstruiert ein Frame für  den  Signal-Handler  auf  dem  Stack.  Der  Kernel  setzt  den
            Programmzähler für den Thread, so dass er auf die erste Anweisung der Signal-Handler-Funktion zeigt,
            und konfiguriert die Rücksprungadresse für diese Funktion,  so  dass  sie  auf  ein  Stück  Code  im
            Anwendungsraum zeigt, das als Signaltrampolin bekannt ist (beschrieben in sigreturn(2)).

       (3)  Der  Kernel  übergibt  die Steuerung zurück an den Anwendungsraum, wo mit der Ausführung beim Anfang
            der Signal-Handler-Funktion fortgefahren wird.

       (4)  Wenn der Signal-Handler zurückkehrt, wird die Steuerung an den Signal-Trampolin-Code übergeben.

       (5)  Das Signaltrampolin ruft den Systemaufruf sigreturn(2) auf, der die Informationen auf dem in Schritt
            1  erstellten  Stack-Frame verwendet, um den Thread in dem Zustand wiederherzustellen, in dem er vor
            dem Aufruf des Signal-Handlers war. Die Signalmaske und die alternativen  Signal-Stack-Einstellungen
            des  Threads  werden  als  Teil  dieser  Prozedur  wiederhergestellt. Nach Abschluss des Aufrufs von
            sigreturn(2) übergibt der Kernel die Steuerung wieder an den Anwendungsraum zurück  und  der  Thread
            fährt mit der Ausführung an dem Punkt fort, an dem er durch den Signal-Handler unterbrochen wurde.

       Beachten  Sie,  dass  der  abschließende  Schritt  nicht  ausgeführt wird, falls der Signal-Handler nicht
       zurückkehrt (z.B. weil die Steuerung mittels siglongjmp(3) aus dem Handler herausverlegt wurde  oder  der
       Handler  mittels  execve(2)  ein  neues  Programm ausführt). In solchen Szenarien ist es insbesondere die
       Verantwortung   des   Programmierers,   den   Zustand   der    Signalmaske    (mittels    sigprocmask(2))
       wiederherzustellen,  falls  gewünscht  wird, die Blockierung der Signale aufzuheben, die beim Eintritt in
       den Signal-Handler blockiert wurden. (Beachten Sie, dass siglongjmp(3) die Signal-Maske  wiederherstellen
       könnte  oder  auch  nicht,  abhängig  vom  Wert savesigs, der beim entsprechenden Aufruf von sigsetjmp(3)
       festgelegt wurde.)

       Vom Standpunkt des Kernels aus ist die Ausführung des Signal-Handler-Codes  genau  das  gleiche  wie  die
       Ausführung  jedes  anderen  Codes  im  Anwendungsraum. Dies bedeutet, dass der Kernel keinerlei besondere
       Zustandsinformationen aufzeichnet, die anzeigen, dass der Thread sich derzeit  in  der  Ausführung  eines
       Signal-Handlers  befindet.  Alle notwendigen Zustandsinformationen werden in Anwendungsraum-Registern und
       im Anwendungsraum-Stack verwaltet. Die Tiefe, zu  der  verschachtelte  Signal-Handler  aufgerufen  werden
       können,  wird  daher  durch  den  Anwendungsraum-Stack  begrenzt  (und  unterliegt  daher  dem Design der
       Software).

   Standard-Signale
       Linux untersützt die nachfolgend aufgeführten Standard-Signale. Die zweite Spalte der Tabelle  zeigt  an,
       welcher  Standard  (falls  vorhanden)  das  Signal  festlegt:  »P1990«  zeigt  an, dass das Signal in dem
       ursprünglichen Standard POSIX.1-1990 beschrieben wurde; »P2001« zeigt an, dass das Signal  in  SUSv2  und
       POSIX.1-2001 hinzugefügt wurde.

       Signal      Standard   Aktion   Kommentar
       ──────────────────────────────────────────────────────────────────────────────────────────
       SIGABRT      P1990      Core    Abbruchsignal von abort(3)
       SIGALRM      P1990      Term    Timersignal von alarm(2)
       SIGBUS       P2001      Core    Bus-Fehler (Speicherzugriffsfehler)
       SIGCHLD      P1990      Ign     Kindprozess angehalten oder beendet
       SIGCLD         -        Ign     ein Synonym für SIGCHLD
       SIGCONT      P1990      Cont    fortsetzen, wenn angehalten
       SIGEMT         -        Term    Emulator-Ausnahmebehandlung
       SIGFPE       P1990      Core    Fließkomma-Ausnahmefehler
       SIGHUP       P1990      Term    Verbindung am steuernden Terminal beendet
                                       (aufgehängt) oder der steuernde Prozess wurde beendet
       SIGILL       P1990      Core    ungültiger Befehl
       SIGINFO        -                ein Synonym für SIGPWR
       SIGINT       P1990      Term    Unterbrechung von der Tastatur
       SIGIO          -        Term    E/A jetzt möglich (4.2BSD)
       SIGIOT         -        Core    IOT-Ausnahmebehandlung; ein Synonym für SIGABRT
       SIGKILL      P1990      Term    Kill-Signal
       SIGLOST        -        Term    Dateisperre verloren/aufgehoben (nicht verwandt)
       SIGPIPE      P1990      Term    defekte Pipe: Schreiben in eine Pipe ohne
                                       Leser; siehe pipe(7)
       SIGPOLL      P2001      Term    abfragbares Ereignis (Sys V)
                                       Synonym für SIGIO
       SIGPROF      P2001      Term    Profiling-Timer abgelaufen
       SIGPWR         -        Term    Stromausfall (System V)
       SIGQUIT      P1990      Core    Abbruch von der Tastatur
       SIGSEGV      P1990      Core    ungültige Speicherreferenz
       SIGSTKFLT      -        Term    Stack-Ausnahmebehandlung am Koprozessor (nicht verwendet)
       SIGSTOP      P1990      Stop    Stop process
       SIGTSTP      P1990      Stop    Stop am Terminal eingegeben
       SIGSYS       P2001      Core    Ungültiger Systemaufruf (SVr4);
                                       siehe auch seccomp(2)
       SIGTERM      P1990      Term    Beendigungssignal (termination signal)
       SIGTRAP      P2001      Core    Trace-/Haltepunkt-Ausnahmebehandlung
       SIGTTIN      P1990      Stop    Terminal-Eingabe für Hintergrundprozess
       SIGTTOU      P1990      Stop    Terminal-Ausgabe für Hintergrundprozess
       SIGUNUSED      -        Core    synonym mit SIGSYS
       SIGURG       P2001      Ign     dringende Gegebenheit an Socket (4.2BSD)
       SIGUSR1      P1990      Term    benutzerdefiniertes Signal 1
       SIGUSR2      P1990      Term    benutzerdefiniertes Signal 2
       SIGVTALRM    P2001      Term    virtueller Wecker (4.2BSD)
       SIGXCPU      P2001      Core    CPU-Zeitbegrenzung überschritten (4.2BSD)
                                       siehe setrlimit(2)
       SIGXFSZ      P2001      Core    Dateigrößenbegrenzung überschritten (4.2BSD)
                                       siehe setrlimit(2)
       SIGWINCH       -        Ign     Änderung der Fenstergröße (4.3BSD, Sun)

       Die Signale SIGKILL und SIGSTOP können nicht abgefangen, blockiert oder ignoriert werden.

       Bis  einschließlich  Linux  2.2  war  das Standardverhalten für SIGSYS, SIGXCPU, SIGXFSZ und (auf anderen
       Architekturen als SPARC und MIPS) SIGBUS den Prozess (ohne einen Speicherauszug zu erzeugen) zu  beenden.
       (Auf  einigen anderen UNIX-Systemen ist die Standardaktion für SIGXCPUund SIGXFSZ, den Prozess ohne einen
       Speicherauszug zu beenden.) Linux 2.4 entspricht den Anforderungen von POSIX.1-2001 an diese Signale  und
       beendet den Prozess mit einem Speicherauszug.

       SIGEMT   ist   nicht  in  POSIX.1-2001  angegeben,  erscheint  aber  trotzdem  auf  den  meisten  anderen
       UNIX-Systemen. Dort ist  die  Standardaktion  in  der  Regel  die  Beendigung  des  Prozesses  mit  einem
       Speicherauszug.

       SIGPWR  (nicht  in  POSIX.1-2001  beschrieben) wird bei seinem Eintreten von diesen anderen UNIX-Systemen
       ignoriert.

       SIGIO (nicht in POSIX.1-2001 beschrieben) wird  standardmäßig  auf  verschiedenen  anderen  UNIX-Systemen
       ignoriert.

   Warteschlange und Auslieferungssemantik für Standard-Signale
       Falls für einen Prozess mehrere Standard-Signale anhängig sind, ist die Reihenfolge, in der diese Signale
       ausgeliefert werden, nicht spezifiziert.

       Standard-Signale kennen keine Warteschlange. Falls  mehrere  Instanzen  eines  Standard-Signals  erstellt
       werden, während dieses Signal blockiert ist, wird nur eine Instanz des Signals als anhängig markiert (und
       das Signal  wird  ausgeliefert,  genau  wenn  die  Blockade  aufgehoben  wird).  Im  Fall,  bei  dem  ein
       Standard-Signal  bereits  anhängig  ist,  wird  die  dem  Signal  zugehörige  Struktur  siginfo_t  (siehe
       sigaction(2)) nicht bei der Ankunft nachfolgender Instanzen des  gleichen  Signals  überschrieben.  Daher
       wird der Prozess die Informationen, die zu der ersten Instanz des Signals gehören, erhalten.

   Signalnummerierung für Standard-Signale
       Der  numerische  Wert  für  jedes  Signal wird in der nachfolgenden Tabelle angegeben. Wie in der Tabelle
       gezeigt, haben viele Signale verschiedene numerische Werte auf  verschiedenen  Architekturen.  Der  erste
       numerische Wert in jeder Zeile zeigt die Signalnummer auf X86, ARM und den meisten anderen Architekturen;
       der zweite Wert ist für Alpha und SPARC; der dritte für MIPS und der letzte für PARISC.  Ein  Bindestrich
       (-) zeigt an, dass ein Signal auf der entsprechenden Architektur nicht vorhanden ist.

       Signal            x86/ARM         Alpha/   MIPS   PARISC   Hinweise
                   die meisten anderen   SPARC
       ──────────────────────────────────────────────────────────────────────────────
       SIGHUP               1               1       1       1
       SIGINT               2               2       2       2
       SIGQUIT              3               3       3       3
       SIGILL               4               4       4       4
       SIGTRAP              5               5       5       5
       SIGABRT              6               6       6       6
       SIGIOT               6               6       6       6
       SIGBUS               7              10      10      10
       SIGEMT               -               7       7      -
       SIGFPE               8               8       8       8
       SIGKILL              9               9       9       9
       SIGUSR1             10              30      16      16
       SIGSEGV             11              11      11      11
       SIGUSR2             12              31      17      17
       SIGPIPE             13              13      13      13
       SIGALRM             14              14      14      14
       SIGTERM             15              15      15      15
       SIGSTKFLT           16              -       -        7
       SIGCHLD             17              20      18      18
       SIGCLD               -              -       18      -
       SIGCONT             18              19      25      26
       SIGSTOP             19              17      23      24
       SIGTSTP             20              18      24      25
       SIGTTIN             21              21      26      27
       SIGTTOU             22              22      27      28
       SIGURG              23              16      21      29
       SIGXCPU             24              24      30      12
       SIGXFSZ             25              25      31      30
       SIGVTALRM           26              26      28      20
       SIGPROF             27              27      29      21
       SIGWINCH            28              28      20      23
       SIGIO               29              23      22      22
       SIGPOLL                                                    identisch zu SIGIO
       SIGPWR              30             29/-     19      19
       SIGINFO              -             29/-     -       -
       SIGLOST              -             -/29     -       -
       SIGSYS              31              12      12      31
       SIGUNUSED           31              -       -       31

       Beachten Sie Folgendes:

       •  Wenn  das  Signal  definiert  ist,  ist SIGUNUSED synonym zu SIGSYS. Seit Glibc 2.26 ist SIGUNUSED auf
          keiner Architektur mehr definiert.

       •  Signal 29 ist SIGINFO / SIGPWR (synonym für den gleichen Wert) auf einer Alpha-Maschine, aber  SIGLOST
          auf einer SPARC.

   Echtzeit-Signale
       Beginnend   mit   Linux   2.2   unterstützt   Linux   Echtzeit-Signale,   wie  sie  ursprünglich  in  den
       POSIX.1b-Echtzeit-Erweiterungen definiert wurden (und jetzt in POSIX.1-2001 enthalten sind). Die  Bereich
       der  unterstützten  Echtzeit-Signale  wird  von  den Makros SIGRTMIN und SIGRTMAX definiert. POSIX.1-2001
       verlangt, dass eine Umsetzung mindestens _POSIX_RTSIG_MAX (8) Echtzeit-Signale unterstützt.

       Der Linux-Kernel unterstützt eine Reihe von 33 verschiedenen Echtzeit-Signalen, nummeriert von 32 bis 64.
       Doch  die Glibc-Umsetzung der POSIX-Threads verwendet intern zwei (für NPTL) oder drei (für LinuxThreads)
       Echtzeit-Signale (siehe pthreads (7)) und stellt den Wert von SIGRTMIN passend (auf 34 oder 35  ein).  Da
       die  Zahl  der  verfügbaren  Echtzeit-Signale  je nach Glibc-Threading-Implementierung variiert und diese
       Variation (entsprechend dem verfügbaren Kernel und der Glibc) zur Laufzeit auftreten kann und tatsächlich
       die verfügbaren Echtzeitsignale je nach UNIX-System variieren, sollten Programme niemals mit eincodierten
       Zahlen auf Echtzeit-Signale verweisen. Stattdessen sollte auf Echtzeit-Signale  immer  mit  der  Notation
       SIGRTMIN+n verwiesen werden und zur Laufzeit überprüft werden, ob (SIGRTMIN+n) SIGRTMAX nicht übersteigt.

       Im  Gegensatz  zu  Standard-Signalen haben Echtzeit-Signale keine vordefinierten Bedeutungen: der gesamte
       Satz von Echtzeit-Signalen kann für anwendungsspezifische Zwecke genutzt werden.

       Die Standardaktion für ein nicht abgefangenes Echtzeit-Signal ist der Abbruch des Prozesses.

       Echtzeit-Signale zeichnen sich durch folgende Merkmale aus:

       •  Von Echtzeit-Signalen können mehrere Instanzen anstehen. Im Gegensatz dazu wird beim Versand  mehrerer
          Instanzen  eines  Standard-Signals,  während das Signal aktuell blockiert ist, nur eine Instanz weiter
          anstehen.

       •  Wenn das Signal mit Hilfe von sigqueue(3) gesendet wird, kann mit ihm ein begleitender Wert  (entweder
          eine  Ganzzahl  (Integer)  oder  ein Zeiger) gesendet werden. Wenn der empfangende Prozess mittels des
          SA_SIGINFO-Schalters für sigaction(2) einen Handler für dieses Signal implementiert, kann dieser  Wert
          aus  dem  si_value-Feld  der  siginfo_t-Struktur  (das  zweite Argument des Handlers) bestimmt werden.
          Darüber hinaus können die Felder si_uid und si_pid dieser Struktur verwendet werden, um  die  PID  und
          reale Benutzerkennung des Prozesses zu erhalten, der das Signal erzeugt hat.

       •  Echtzeit-Signale  werden  in  einer  garantierten Reihenfolge zugestellt. Mehrere Echtzeit-Signale des
          gleichen Typs werden in der Reihenfolge zugestellt, in der  sie  gesendet  wurden.  Wenn  verschiedene
          Echtzeit-Signale  an  einen Prozess geschickt werden, wird das Signal mit der niedrigsten Signalnummer
          zuerst zugestellt. (D.h. niedrig nummerierte Signale haben höchste Priorität.) Im Gegensatz  dazu  ist
          die  Reihenfolge  der  Zustellung  mehrerer  für  einen  Prozess  anstehender  Standard-Signale  nicht
          festgelegt.

       Wenn sowohl Standard- als auch Echtzeit-Signale für einen Prozess  anstehen,  macht  POSIX  keine  Angabe
       dazu,  welche  Signale  zuerst  zugestellt werden. Linux gibt wie auch viele andere Implementierungen den
       Standard-Signalen den Vorzug.

       Nach  POSIX  sollte  eine  Umsetzung  mindestens  _POSIX_SIGQUEUE_MAX  (32)   Echtzeit-Signale   in   der
       Warteschlange  eines  Prozesses  ermöglichen. Allerdings macht Linux das anders. Bis einschließlich Linux
       2.6.7 legt Linux eine systemweite Obergrenze für die Anzahl wartender Echtzeit-Signale für alle  Prozesse
       fest.   Diese   Grenze   kann   eingesehen   und   (mit   entsprechenden   Rechten)   durch   die   Datei
       /proc/sys/kernel/rtsig-max geändert werden. Aus der verwandten Datei /proc/sys/kernel/rtsig-nr  kann  die
       Anzahl der aktuell anstehenden Signale ermittelt werden. In Linux 2.6.8 wurden diese /proc-Schnittstellen
       durch die Ressource RLIMIT_SIGPENDING, die einen benutzerspezifischen Grenzwert für anstehende Signale in
       der Warteschlange festlegt, ersetzt (siehe setrlimit(2)).

       Die  Ergänzung um Echtzeitsignale erforderte die Verbreiterung der Signalmengenstruktur (sigset_t) von 32
       auf 64 Bit. Konsequenterweise wurden viele Systemaufrufe  durch  neue  Systemaufrufe  abgelöst,  die  die
       größeren Signalmengen unterstützten. Die alten und neuen Systemaufrufe sind wie folgt:

       Linux 2.0 und älter   Linux 2.2 und neuer

       sigaction(2)          rt_sigaction(2)
       sigpending(2)         rt_sigpending(2)
       sigprocmask(2)        rt_sigprocmask(2)
       sigreturn(2)          rt_sigreturn(2)
       sigsuspend(2)         rt_sigsuspend(2)
       sigtimedwait(2)       rt_sigtimedwait(2)

   Unterbrechung von Systemaufrufen und Bibliotheksfunktionen durch Signal-Handler
       Wenn  ein  Signal-Handler  aufgerufen  wird,  während  ein  Systemaufruf  oder Bibliotheksfunktionsaufruf
       blockiert ist, wird entweder:

       •  nach Abschluss des Signal-Handlers der Aufruf neu gestartet oder

       •  der Aufruf schlägt mit dem Fehler EINTR fehl.

       Welche dieser beiden Verhaltensweisen eintritt, hängt von  der  Schnittstelle  und  der  Verwendung  oder
       Nichtverwendung  des  Schalters  SA_RESTART  ab (siehe sigaction(2)). Die Einzelheiten unterscheiden sich
       zwischen UNIX-Systemen. Im Folgenden werden die Linux-Spezifika erörtert.

       Wenn ein blockierter Aufruf einer der folgenden  Schnittstellen  von  einem  Signal-Handler  unterbrochen
       wird,  wird  der  Aufruf  nach  der  Rückkehr  aus dem Signal-Handler erneut gestartet, wenn der Schalter
       SA_RESTART verwendet wurde; anderenfalls schlägt der Aufruf mit dem Fehler EINTR fehl:

       •  Aufrufe von read(2), readv(2), write(2), writev(2) und ioctl(2) für »langsame« Geräte. Bei »langsamen«
          Geräten  kann  ein  E-/A-Aufruf  für  eine unbestimmte Zeit zu einer Blockade führen. Zu ihnen gehören
          beispielsweise Terminals, Pipes und Sockets. Hat ein E-/A-Aufruf für ein langsames Gerät  schon  Daten
          übertragen  und wird durch einen Signal-Handler unterbrochen, wird der Aufruf mit einem Erfolgs-Status
          abgeschlossen (normalerweise ist das die Zahl übertragener Bytes). Beachten Sie,  dass  eine  (lokale)
          Festplatte  nach dieser Definition kein langsames Gerät ist. E/A-Aktionen auf Fesplattengeräten werden
          durch Signale nicht unterbrochen.

       •  open(2), wenn er blockieren kann (z. B. beim Öffnen eines FIFOs; siehe fifo(7)).

       •  wait(2), wait3(2), wait4(2), waitid(2) und waitpid(2).

       •  Socket-Schnittstellen: accept(2), connect(2), recv(2), recvfrom(2), recvmmsg(2), recvmsg(2),  send(2),
          sendto(2)  und  sendmsg(2),  es  sei  denn,  es  wurde  für  den  Socket eine Zeitbegrenzung (Timeout)
          festgelegt (siehe unten).

       •  Dateisperrende Schnittstellen: flock(2) und die Aktionen F_SETLKW und F_OFD_SETLKW von fcntl(2).

       •  POSIX-Schnittstellen für Nachrichten-Warteschlangen:  mq_receive(3),  mq_timedreceive(3),  mq_send(3),
          and mq_timedsend(3).

       •  futex(2) FUTEX_WAIT (seit Linux 2.6.22; vorher immer Fehlschlag mit EINTR).

       •  io_getevents(2)

       •  pthread_mutex_lock(3), pthread_cond_wait(3) und verwandte APIs.

       •  futex(2) FUTEX_WAIT_BITSET.

       •  POSIX-Semaphor-Schnittstellen:  sem_wait(3)  und  sem_timedwait(3)  (seit  Linux  2.6.22; vorher immer
          Fehlschlag mit EINTR).

       •  read(2) von einem inotify(7)-Dateideskriptor (seit Linux 3.8; vorher immer Fehlschlag mit EINTR).

       Folgende Schnittstellen werden nach einer Unterbrechung durch einen Signal-Handler,  unabhängig  von  der
       Verwendung von SA_RESTART nie erneut gestartet; sie schlagen immer mit dem Fehler EINTR fehl:

       •  »Eingabe«-Socket-Schnittstellen,  wenn  für  den  Socket  mittels  setsockopt(2)  eine  Zeitbegrenzung
          (Timeout, SO_RCVTIMEO) festgelegt wurde: accept(2), recv(2), recvfrom(2), recvmmsg(2) (auch mit  einem
          von NULL verschiedenen Argument timeout) und recvmsg(2).

       •  »Ausgabe«-Socket-Schnittstellen,  wenn  für  den  Socket  mittels  setsockopt(2)  eine  Zeitbegrenzung
          (Timeout, SO_RCVTIMEO) festgelegt wurde: connect(2), send(2), sendto(2) und sendmsg(2).

       •  Schnittstellen, mit denen auf Signale gewartet  wird:  pause(2),  sigsuspend(2),  sigtimedwait(2)  und
          sigwaitinfo(2).

       •  Schnittstellen,   die  Dateideskriptoren  mehrfach  nutzen:  epoll_wait(2),  epoll_pwait(2),  poll(2),
          ppoll(2), select(2) und pselect(2).

       •  System-V-IPC-Schnittstellen: msgrcv(2), msgsnd(2), semop(2), and semtimedop(2).

       •  Schlaf-Systemaufrufe: clock_nanosleep(2), nanosleep(2), and usleep(3).

       •  io_getevents(2)

       Die Funktion sleep(3) wird ebenfalls niemals neu gestartet, wenn sie  durch  einen  Handler  unterbrochen
       wurde, wird aber erfolgreich verlassen: Der Rückgabewert ist die Zeit, die noch geschlafen werden sollte.

       Unter  bestimmten  Umständen  kann die Benachrichtigungsfunktionalität im Benutzerraum von seccomp(2) zum
       Neustart von Systemaufrufen führen, die andernfalls niemals durch  SA_RESTART  neugestartet  würden;  für
       Details siehe seccomp_unotify(2).

   Unterbrechung von Systemaufrufen und Bibliotheksfunktionen durch Stop-Signale
       Auf  Linux  können  sogar  ohne  Signal-Handler  bestimmte  sperrende  Systemaufrufe mit dem Fehler EINTR
       fehlschlagen, nachdem der Prozess von einem der Stop-Signale  gestoppt  wird  und  dann  mittels  SIGCONT
       wieder fortgesetzt. Dieses Verhalten wird von POSIX.1 nicht gebiligt und tritt nicht auf anderen Systemen
       auf.

       Die folgenden Linux-Schnittstellen zeigen dieses Verhalten:

       •  »Eingabe«-Socket-Schnittstellen,  wenn  für  den  Socket  mittels  setsockopt(2)  eine  Zeitbegrenzung
          (Timeout,  SO_RCVTIMEO) festgelegt wurde: accept(2), recv(2), recvfrom(2), recvmmsg(2) (auch mit einem
          von NULL verschiedenen Argument timeout) und recvmsg(2).

       •  »Ausgabe«-Socket-Schnittstellen,  wenn  für  den  Socket  mittels  setsockopt(2)  eine  Zeitbegrenzung
          (Timeout,  SO_RCVTIMEO)  festgelegt  wurde:  connect(2), send(2), sendto(2) und sendmsg(2), falls eine
          Sendezeitüberschreitung (SO_SNDTIMEO) gesetzt wurde.

       •  epoll_wait(2), epoll_pwait(2).

       •  semop(2), semtimedop(2).

       •  sigtimedwait(2), sigwaitinfo(2).

       •  Linux 3.7 und älter: read(2) von einem inotify(7)-Dateideskriptor

       •  Linux 2.6.21 und früher: futex(2) FUTEX_WAIT, sem_timedwait(3), sem_wait(3).

       •  Linux 2.6.8 und früher: msgrcv(2), msgsnd(2).

       •  Linux 2.4 und früher: nanosleep(2).

STANDARDS

       POSIX.1, mit den beschriebenen Ausnahmen

ANMERKUNGEN

       Für eine Diskussion asynchron-Signal-sicherer Funktionen, siehe signal-safety(7).

       Die Datei /proc/[pid]/task/[TID]/status enthält verschiedene Felder, die  die  Signale,  die  ein  Thread
       blockiert  (SigBlk),  abfängt  (SigCgt)  oder ignoriert (SigIgn) zeigt. (Die Gruppe der abgefangenen oder
       ignorierten Signale wird für alle Threads eines Prozesses  identisch  sein.)  Andere  Felder  zeigen  die
       Gruppe  der  anhängenden  Signale,  die  für  den  Thread  bestimmt  sind  (SigPnd)  sowie die Gruppe der
       anhängenden Signale, die für den Prozess als ganzes bestimmt sind (ShdPnd). Die entsprechenden Felder  in
       /proc/[PID]/status zeigen die Informationen für den Haupt-Thread. Siehe proc(5) für weitere Details.

FEHLER

       Es  gibt  sechs  Signale,  die  als  Konsequenz aus einer Hardware-Ausnahmebehandlung ausgeliefert werden
       können: SIGBUS, SIGEMT, SIGFPE, SIGILL, SIGSEGV und SIGTRAP. Welches dieser Signale  für  eine  bestimmte
       Hardware-Ausnahmebehandlung ausgeliefert wird, ist nicht dokumentiert und ergibt nicht immer Sinn.

       Zum   Beispiel  kann  ein  ungültiger  Speicherzugriff,  der  die  Auslieferung  von  SIGSEGV  auf  einer
       CPU-Architektur hervorruft, die Auslieferung von SIGBUS auf einer anderen Architektur (oder  andersherum)
       hervorrufen.

       Als weiteres Beispiel löst die Verwendung der X86-int-Anweisung mit einem verbotenen Argument (jeder Zahl
       außer 3 und 128) die Auslieferung von SIGSEGV aus, obwohl SIGILL mehr Sinn ergäbe, aufgrund der Art,  wie
       die CPU die verbotene Operation an den Kernel berichtet.

SIEHE AUCH

       kill(1),  clone(2),  getrlimit(2), kill(2), pidfd_send_signal(2), restart_syscall(2), rt_sigqueueinfo(2),
       setitimer(2),  setrlimit(2),   sgetmask(2),   sigaction(2),   sigaltstack(2),   signal(2),   signalfd(2),
       sigpending(2),  sigprocmask(2),  sigreturn(2),  sigsuspend(2),  sigwaitinfo(2),  abort(3), bsd_signal(3),
       killpg(3), longjmp(3), pthread_sigqueue(3), raise(3), sigqueue(3),  sigset(3),  sigsetops(3),  sigvec(3),
       sigwait(3),   strsignal(3),  swapcontext(3),  sysv_signal(3),  core(5),  proc(5),  nptl(7),  pthreads(7),
       sigevent(7)

ÜBERSETZUNG

       Die   deutsche    Übersetzung    dieser    Handbuchseite    wurde    von    Martin    Eberhard    Schauer
       <Martin.E.Schauer@gmx.de>,    Dr.    Tobias    Quathamer    <toddy@debian.org>   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⟩.