Your Browser is not longer supported

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

{{viewport.spaceProperty.prod}}

User Signal Routinen (Unix- und Linux-Systeme)

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. 

Beispiel
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.


Beispiel
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 ()