Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

Freie Verwendung von STXIT-Contingency-Routinen

&pagelevel(3)&pagelevel

Bei speziellen Anforderungen, die durch die Funktion signal nicht abgedeckt sind (siehe Abschnitt "C-Bibliotheksfunktionen (alarm, raise, signal)“), können STXIT-Contingency-Routinen in C frei programmiert werden. Solche Anforderungen sind z.B. umfangreichere Informationsübergaben oder mehr Fortsetzungs-Steuermöglickeiten nach Ablauf der STXIT-Contingency-Routine.

Die Definition einer frei programmierten STXIT-Contingency-Routine muss durch Aufruf der C-Bibliotheksfunktion cstxit bzw. _cstxit erfolgen.

Die Ereignisklasse SVC-Unterbrechung kann auch bei Verwendung der cstxit-Schnittstelle nicht realisiert werden.

Der STXIT-Contingency-Routine wird bei ihrem Anlauf eine Struktur übergeben, die in der Include-Datei <stxit.h> folgendermaßen deklariert ist:

struct stxcontp
{
   int      *intwghtp;     /* pointer to interrupt weight */
   jmp_buf  *termlabp;     /* pointer to termination label */
   int      *regsp;        /* pointer to register save area */
};

Aufbau der STXIT-Contingency-Routine:

Um die oben beschriebene Struktur benutzen zu können, muss die Routine einen formalen Parameter für eine Struktur vom Typ stxcontp vorsehen und ist dann etwa folgendermaßen aufgebaut:

#include <stxit.h>
void stxrout(stxcontpar)
struct stxcontp stxcontpar;
{
       .
       .
       .
}

Diese Routine kann auf drei verschiedene Arten beendet werden:

  • mit der return-Anweisung, das Programm wird an der unterbrochenen Stelle fortgesetzt,

  • durch Aufruf der Funktion longjmp mit einer durch einen setjmp-Aufruf versorgten jmp_buf-Variablen, das Programm wird bei der mit einem setjmp-Aufruf definierten Stelle fortgesetzt oder

  • durch Aufruf der Funktion longjmp mit dem in der stxcontp-Struktur übergebenen Termination-Label (siehe oben).

Die Rückkehr aus der STXIT-Contingency-Routine mit einem longjmp-Aufruf ist bei der Ereignisklasse TERM nicht möglich, da bei Eintritt des Ereignisses (TERM-SVC) die Einträge für die C-Funktionen einschließlich der main-Funktion im C-Laufzeitstack bereits abgebaut sind!