Bei speziellen Anforderungen, die durch die Funktion signal()
nicht abgedeckt sind, können STXIT-Contingency-Routinen in C frei programmiert werden. Solche Anforderungen sind z.B. umfangreichere Informationsübergaben oder mehr Fortsetzungs-Steuermöglichkeiten nach Ablauf der STXIT-Contingency-Routine.
Die Definition einer frei programmierten STXIT-Contingency-Routine muss durch Aufruf der C-Bibliotheksfunktion cstxit()
erfolgen.
Die Ereignisklasse SVC-Unterbrechung kann auch bei Verwendung der cstxit
-Funktion 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 einensetjmp
-Aufruf versorgten Variablen vom Typjmp_buf
, das Programm wird bei der mit einemsetjmp
-Aufruf definierten Stelle fortgesetzt oderdurch Aufruf der Funktion
longjmp()
mit dem in derstxcontp
-Struktur übergebenen Termination-Label.
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.