#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.
signum | Signalnummer |
action | Behandlungsroutine |
Es gibt drei Weisen, Signale zu behandeln.
action
den Wert SIG_DFL
, wird die Standardbehandlung durchgeführt.action
den Wert SIG_IGN
, wird das Signal ignoriert.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.
Rückgabewert: alte Fehlerbehandlungsroutine, bei Fehler SIG_ERR
.
#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; } }