Inhaltsverzeichnis

signal()

#include <csignal>

sighandler_t signal (int signum, sighandler_t action) 

Legt fest, welche Funktion action beim Signal |signum| ausgeführt werden soll.

Warnung: Destruktoren automatischer und statischer Objekte werden nicht aufgerufen. In C++ sollte der Mechanismus der Ausnahmebehandlung vorgezogen werden. Werden jedoch von älteren Anwendungs-Bibliotheken Signale ausgelöst, kann eine Signalbehandlung notwendig sein, um Sicherungsmaßnahmen vor dem Programmende zu treffen.

Parameter

signum Signalnummer
action Behandlungsroutine

Es gibt drei Weisen, Signale zu behandeln.

  1. Hat action den Wert SIG_DFL, wird die Standardbehandlung durchgeführt.
  2. Hat action den Wert SIG_IGN, wird das Signal ignoriert.
  3. Ansonsten sollte action auf eine Funktion zeigen.

Eine Fehlerbehandlungsroutine muss folgenden Typ haben:

typedef void (*sighandler_t)(int);

Was geschieht, wenn während einer Signalbehandlung weitere Signale eintreffen, ist implementationsabhängig. Konsultieren Sie in jedem Fall ihre Systemdokumentation.

Ergebnis

Rückgabewert: alte Fehlerbehandlungsroutine, bei Fehler SIG_ERR.

Siehe auch

abort(), raise().

Beispiel

signal.cpp
#include <cstdio>
#include <csignal>
using namespace std;
 
int ist_prim(int p)
{
  int erg = p>=2;
  for (int i = 2; i < p; ++i)
  {
    if (p%i == 0) erg = 0;
  }
  return erg;
}
 
int max_prim = 2;
 
void tschuess(int num)
{
  printf("groesste gefundene Primzahl: %d\n", max_prim); 
  signal(SIGINT, SIG_DFL);  
  raise(SIGINT);           // unsauber ???
}
 
void zwischenbericht(int num)
{
  static int versuch = 1;
  printf("Versuch %d bei %d\n", versuch, max_prim); 
  signal(SIGINT, ++versuch < 3 ? zwischenbericht : tschuess);
}
 
int main()
{
  printf("Suche grosse Primzahl\nAbbruch mit Strg+C (3 Versuche)\n");
  signal(SIGINT, zwischenbericht);
  for (int n = 1; n > 0; ++n) 
  {
    if (ist_prim(n)) max_prim = n;     
  }
}