Eine User Signal Routine wird mit der Funktion KCX_REG_USER_SIGNAL_HANDLER im Teilprogramm oder im Start-Exit registriert, d.h. erst dann ist die anwenderspezifische Signalbehandlung aktiviert.
Mit KCX_UN_REG_USER_SIGNAL_HANDLER wird sie wieder de-registriert und damit deaktiviert.
Funktion KCX_REG_USER_SIGNAL_HANDLER
Die Funktion KCX_REG_USER_SIGNAL_HANDLER benötigt als Aufruf-Parameter einen Funktionspointer, der auf eine User Signal Routine zeigt. D.h. der Aufrufparameter muss vom Typ "PROCEDURE-POINTER" sein und wird automatisch per Reference, d.h. als Adresse dieses Pointers, übergeben.
Hinweis
Um diese Funktion nutzen zu können, muss Ihre COBOL Compiler Version den COBOL Datentyp "PROCEDURE-POINTER" unterstützen.
Micro Focus Visual Cobol 2.2 oder höher unterstützt z.B. diesen Datentyp.
WORKING-STORAGE section. 01 install-address-4-sig usage procedure-pointer. PROCEDURE DIVISION USING KCKBC KCSPAB. set install-address-4-sig to entry "MFCBLOOP-SIGNAL". CALL "KCX_REG_USER_SIGNAL_HANDLER" USING install-address-4-sig.
Funktion KCX_UN_REG_USER_SIGNAL_HANDLER
Durch den Aufruf von KCX_UN_REG_USER_SIGNAL_HANDLER aus dem Anwendungsprogramm wird die aktuelle User Signal Routine bei openUTM wieder deregistriert, d.h. deaktiviert. Ab diesem Zeitpunkt ist wieder die Standard Fehlerbehandlung von openUTM aktiviert.
Die Funktion wird ohne Parameter aufgerufen.
Programmierung der Signal Routine
Die User Signal Routine erhält immer drei Aufrufparameter:
Param-1
Die System Signal-Nummer als binäre, 4 Byte lange Variable, d.h. Datentyp "PIC 9(9) COMP-5"
.
Param-2
Mit Null-Byte abgeschlossene maximal 255 Bytes lange "abdruckbare" Erklärung der System Signalnummer, z.B. "Segmentation fault" bei Signal 11.
Param-3
Eine mit Null-Byte abgeschlossene, mehrzeilige und maximal 4096 Bytes lange Stack-Information.
Die User Signal Routine sollte nur "Aufräumaktionen" veranlassen und das Programm mit PEND RE beenden:
KDCS-Aufruf RSET
KDCS-Aufruf MPUT NE mit Fehler-Infos aus den Parametern der Anwender-Signal-Routine
KDCS-Aufruf PEND RE mit KCRN="Folge-TAC"
Hinweise
Die Funktion darf nicht mit "GOBACK" oder "EXIT PROGRAM" verlassen werden.
Beim Aufruf der User Signal Routine in COBOL kann es vorkommen, dass das Micro Focus COBOL Laufzeitsystem eine Rekursion erkennt und den Aufruf ablehnt.
Falls dies der Fall ist, muss im Anwender Teilprogramm bei der Definition der PROGRAM-ID noch der Zusatz "IS RECURSIVE" ergänzt werden, z.B.:
PROGRAM-ID. MFCBLOOP IS RECURSIVE.
WORKING-STORAGE section. 01 signal-number-print pic 9(9). LINKAGE SECTION. 01 utm-stack-string pic x(4096). 01 utm-signal-string pic x(255). 01 utm-signal-number pic 9(9) COMP-5. PROCEDURE DIVISION USING KCKBC KCSPAB. ENTRY 'MFCBLOOP-SIGNAL' USING utm-signal-number utm-signal-string utm-stack-string. MOVE utm-signal-number to signal-number-print. DISPLAY "UTM-SIGNAL-NUMBER IS "signal-number-print.
Danach folgen z.B. die KDCS-Aufrufe RSET, MPUT und PEND RE.
Beispiel für an eine User Signal Routine übergebene Parameter
utm-signal-number: 11
utm-signal-string: "Segmentation fault"
utm-stack-string:
#6 0x00007f712cf3103f in KCSSIGNAL () from /opt/lib/utm 70a00/sys/libwork.so
#7 <signal handler called>
#8 0x00007f712e6aff30 in MFCBNULL () at MFCBNULL.c:17
#9 0x00007f712e27b418 in MFCBCALL_INIT-OP () at MFCBCALL.cbl:81
#10 0x00007f712e27b267 in MFCBCALL_INIT-OP () at MFCBCALL.cbl:59
#11 0x00007f712e27ae6a in MFCBCALL () from /home/user/filebase/utmcob.so
#12 0x00007f712e904b97 in KDCCCOB2 () from /home/user/filebase/proot.so
#13 0x00007f712cf2f7e3 in KDCHLLC () from /opt/lib/utm70a00/libwork.so
#14 0x00007f712cf8e37c in START_TEILPROGRAM () from /opt/lib/utm70a00/sys/libwork.so
#15 0x00007f712cf83658 in KDCRTMM () from /opt/lib/utm70a00/sys/libwork.so
#16 0x00007f712cf91cc3 in KDCRTSI () from /opt/lib/utm70a00/libwork.so
#17 0x00007f712cf2f36c in KDCRTST () from /opt/lib/utm70a00/libwork.so
#18 0x00007f712e90487d in kcxmnt () from /home/user/filebase/proot.so
#19 0x000000000040207c in main ()