Provided by: manpages-de-dev_1.4-1_all bug

BEZEICHNUNG

       signal - Handhabung von Signalen in ANSI C

ÜBERSICHT

       #include <signal.h>

       typedef void (*sighandler_t)(int);

       sighandler_t signal(int signum, sighandler_t handler);

BESCHREIBUNG

       Das  Verhalten  von  signal()  unterscheidet  sich  zwischen  UNIX-Versionen  und hat sich
       historisch auch zwischen verschiedenen Linux-Versionen geändert. Vermeiden Sie den Einsatz
       dieser  Funktion  und  verwenden  Sie  stattdessen sigaction(2); siehe Portabilität weiter
       unten.

       signal() ordnet dem Signal signum den handler zu. Das ist entweder SIG_IGN,  SIG_DFL  oder
       die Adresse einer vom Programmierer definierten Funktion (eines »Signal Handlers«).

       Falls  dem  Prozess  das  Signal  signum  zugestellt  wird, wird einer der folgenden Fälle
       eintreten:

       *  Falls SIG_IGN zugewiesen wurde, wird das Signal ignoriert.

       *  Falls SIG_DFL zugewiesen wurde, wird die standardmäßig dem  Signal  zugewiesene  Aktion
          ausgeführt, wenn das Signal eintrift (siehe signal(7)).

       *  Falls  eine  Funktion  zugewiesen  wurde,  dann  wird zuerst entweder die Zuweisung auf
          SIG_DFL zurückgesetzt oder das Signal wird  blockiert  (siehe  Portability  unten)  und
          anschließend  handler mit dem Argument signum aufgerufen. Falls der Aufruf des Handlers
          ein Blockieren des Signals verursachte, wird die Blockade nach  der  Rückkehr  aus  dem
          Handler aufgehoben.

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

RÜCKGABEWERT

       signal()   returns  the  previous value of the signal handler, or SIG_ERR on error. In the
       event of an error, errno is set to indicate the cause.

FEHLER

       EINVAL signum ist ungültig.

KONFORM ZU

       C89, C99, POSIX.1-2001.

ANMERKUNGEN

       Die Auswirkungen von signal() in einem Multithread-Prozess sind nicht spezifiziert.

       Gemäß  POSIX  ist  das  Verhalten  eines  Prozesses  nicht  definiert,  nachdem   er   ein
       SIGFPE-Signal,  ein  SIGILL-Signal  oder  ein  SIGSEGVSignal,  das  nicht von kill(2) oder
       raise(3) erzeugt wurde, ignoriert. Eine Integer-Division durch Null hat ein  undefiniertes
       Ergebnis.  Auf  einigen  Architekturen wird die Division ein SIGFPE-Signal erzeugen. (Auch
       die Division der größten negativen Zahl durch -1 kann ein SIGFPE auslösen.) Ein Ignorieren
       dieses Signals könnte zu einer Endlosschleife führen.

       Siehe sigaction(2) für Einzelheiten des Geschehens, wenn SIGCHLD auf SIG_IGN gesetzt wird.

       Siehe signal(7) für eine Liste von Funktionen, die sicher mit asynchronen Signalen umgehen
       können und daher sicher aus einem Signal Handler heraus aufgerufen werden können.

       Die Verwendung von sighandler_t ist eine GNU-Erweiterung, die  durch  die  Definition  von
       _GNU_SOURCE  verfügbar  wird; Glibc definiert zusätzlich (das von BSD abgeleitete)  sig_t,
       wenn _BSD_SOURCE definiert wird. Ohne die Nutzung eines solches Typs ist  die  Deklaration
       von signal() etwas schwerer zu lesen:

           void ( *signal(int signum, void (*handler)(int)) ) (int);

   Portabilität
       Die einzige portable Verwendung von signal() ist die Zuweisung von SIG_DFL oder SIG_IGN zu
       einem Signal. Die Semantik bei der Einrichtung  eines  Signal  Handlers  mittels  signal()
       unterscheidet  sich  zwischen  Systemen (und POSIX.1 erlaubt diese Unterschiede explizit);
       verwenden Sie die Funktion nicht für diesen Zweck.

       POSIX.1 löste das Portabilitätschaos durch die Beschreibung  von  sigaction(2),  die  eine
       explizite  Kontrolle  der Semantik beim Aufruf eines Signal-Handlers ermöglicht; verwenden
       Sie diese Schnittstelle anstatt von signal().

       In the original UNIX systems, when a handler that  was  established  using  signal()   was
       invoked  by  the  delivery  of  a  signal, the disposition of the signal would be reset to
       SIG_DFL, and the system did not block delivery of further instances of the signal. This is
       equivalent to calling sigaction(2)  with the following flags:

           sa.sa_flags = SA_RESETHAND | SA_NODEFER;

       Auch System V bietet diese Semantik für signal(). Das war schlecht, weil das Signal wieder
       eintreffen konnte, bevor der Signal Handler Gelegenheit hatte, sich  erneut  einzurichten.
       Darüber  hinaus  konnten schnell aufeinander folgende Zustellungen des gleichen Signals zu
       rekursiven Aufrufen des Handlers führen.

       BSD improved on this situation, but  unfortunately  also  changed  the  semantics  of  the
       existing signal()  interface while doing so. On BSD, when a signal handler is invoked, the
       signal disposition is not reset, and further instances of  the  signal  are  blocked  from
       being delivered while the handler is executing. Furthermore, certain blocking system calls
       are automatically restarted if interrupted by a signal handler (see  signal(7)).  The  BSD
       semantics are equivalent to calling sigaction(2)  with the following flags:

           sa.sa_flags = SA_RESTART;

       Die Situation unter Linux ist wie folgt:

       * Das signal()-System des Kernels stellt System-V-Semantik bereit.

       * Standardmäßig  nutzt  in  Glibc  2  und  später  die signal()-Wrapper-Funktion nicht den
         Kernel-Systemaufruf.  Stattdessen  ruft  sie  sigaction  (2)  mit  Flags   auf,   welche
         BSD-Semantik  bereitstellen.  Dieses  Standardverhalten  wird  so  lange bereitgestellt,
         solange das Feature-Test-Makro _BSD_SOURCE definiert ist. Standardmäßig ist  _BSD_SOURCE
         definiert.  Es  ist  auch  implizit definiert, wenn man _GNU_SOURCE definiert. Natürlich
         kann es auch explizit definiert werden.

         On glibc 2 and later, if the  _BSD_SOURCE  feature  test  macro  is  not  defined,  then
         signal()   provides  System V semantics. (The default implicit definition of _BSD_SOURCE
         is not provided if one invokes gcc(1)  in one of its standard modes (-std=xxx or  -ansi)
         or  defines  various  other feature test macros such as _POSIX_SOURCE, _XOPEN_SOURCE, or
         _SVID_SOURCE; see feature_test_macros(7).)

       * The signal()  function in Linux libc4 and libc5 provide System V semantics. If one on  a
         libc5  system includes <bsd/signal.h> instead of <signal.h>, then signal()  provides BSD
         semantics.

SIEHE AUCH

       kill(1), alarm(2), kill(2), killpg(2), pause(2), sigaction(2), signalfd(2), sigpending(2),
       sigprocmask(2),  sigsuspend(2),  bsd_signal(3),  raise(3),  siginterrupt(3),  sigqueue(3),
       sigsetops(3), sigvec(3), sysv_signal(3), signal(7)

KOLOPHON

       This page is part of release 3.54 of the Linux man-pages project.  A  description  of  the
       project,     and    information    about    reporting    bugs,    can    be    found    at
       http://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

       Die deutsche Übersetzung dieser Handbuchseite wurde  von  René  Tschirley  <gremlin@cs.tu-
       berlin.de>,    Martin    Schulze   <joey@infodrom.org>   und   Martin   Eberhard   Schauer
       <Martin.E.Schauer@gmx.de> erstellt.

       Diese Übersetzung ist Freie Dokumentation;  lesen  Sie  die  GNU  General  Public  License
       Version   3  oder  neuer  bezüglich  der  Copyright-Bedingungen.  Es  wird  KEINE  HAFTUNG
       übernommen.

       Wenn Sie Fehler in der Übersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-
       Mail an <debian-l10n-german@lists.debian.org>.