home *** CD-ROM | disk | FTP | other *** search
- MODULE showsig;
- __IMP_SWITCHES__
- __DEBUG__
- #ifdef HM2
- #ifdef __LONG_WHOLE__
- (*$!i+: Modul muss mit $i- uebersetzt werden! *)
- (*$!w+: Modul muss mit $w- uebersetzt werden! *)
- #else
- (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
- (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
- #endif
- #endif
-
- #if (defined MM2) && (defined __DEBUG_CODE__)
- IMPORT Debug;
- #endif
-
- VAL_INTRINSIC
- (*
- Programm ist nur mit MultiTOS sinnvoll.
-
- Abbrechen laesst es sich entweder durch einen bel. Tastendruck oder
- durch Senden eines SIGKILL (kill -9 <pid>).
-
- Benutzung: Waehrend das Programm auf einen Tastendruck wartet, koennen
- ihm von einem anderen Programm aus Signale gesendet werden, deren
- Namen ausgegeben werden.
-
- Unter MultiTOS kann das wie folgt geschehen:
-
- o Das Programm wird als TOS-Anwendung durch Doppelklick in einem
- MINIWIN-Fenster gestartet.
-
- o Als naechstes wird in einem zweiten MINIWIN-Fenster eine Shell
- gestartet. Hier wird die Prozess-Id von 'showsig' ermittelt (durch 'ps'),
- worauf dann entsprechende Signale an das Programm gesendet werden
- koennen ('kill -<signr> <pid>'), und 'showsig' gibt dann deren Namen in
- der Form: 'SIG* handled' aus
-
-
- 29-Mai-94, Holger Kleinschmidt
- *)
- FROM SYSTEM IMPORT
- (* PROC *) ADR;
-
- FROM PORTAB IMPORT
- (* TYPE *) UNSIGNEDWORD, UNSIGNEDLONG;
-
- FROM OSCALLS IMPORT
- (* PROC *) Cnecin, Cconws;
-
- FROM DosSupport IMPORT
- (* CONST*) MINSIG, MAXSIG;
-
- FROM sig IMPORT
- (* CONST*) SigDfl, SigIgn, SigErr, SIGKILL, SIGSTOP, SIGTSTP, SIGNULL, NSIG,
- (* TYPE *) SignalHandler,
- (* PROC *) signal;
-
- FROM Terminal IMPORT
- (* PROC *) WriteString, WriteLn, Read;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- VAR new, old : SignalHandler;
- c : CHAR;
- s : INTEGER;
- key : UNSIGNEDLONG;
- res : INTEGER;
- hndlmsg : ARRAY [0..12] OF CHAR;
- sigmsg : ARRAY [MINSIG..MAXSIG] OF
- ARRAY [0..9] OF CHAR;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- #ifdef HM2
- (*$E+,$K+**)
- #endif
- PROCEDURE handler ((* EIN/ -- *) sig : UNSIGNEDLONG );
- (* Der Signalhandler gibt einfach nur das Signal als String aus.
- * Es wird direkt OSCALLS benutzt, damit keine Probleme bei nicht
- * reentranten Bibliotheken entstehen.
- *)
- BEGIN
- Cconws(ADR(sigmsg[VAL(UNSIGNEDWORD,sig)]));
- Cconws(ADR(hndlmsg));
- END handler;
- #ifdef HM2
- (*$E=,$K-*)
- #endif
-
- (*===========================================================================*)
-
- BEGIN (* showsig *)
- hndlmsg := " handled ";
- hndlmsg[8] := 15C;
- hndlmsg[9] := 12C;
-
- sigmsg[0] := "SIGNULL";
- sigmsg[1] := "SIGHUP";
- sigmsg[2] := "SIGINT";
- sigmsg[3] := "SIGQUIT";
- sigmsg[4] := "SIGILL";
- sigmsg[5] := "SIGTRAP";
- sigmsg[6] := "SIGABRT";
- sigmsg[7] := "SIGPRIV";
- sigmsg[8] := "SIGFPE";
- sigmsg[9] := "SIGKILL";
- sigmsg[10] := "SIGBUS";
- sigmsg[11] := "SIGSEGV";
- sigmsg[12] := "SIGSYS";
- sigmsg[13] := "SIGPIPE";
- sigmsg[14] := "SIGALRM";
- sigmsg[15] := "SIGTERM";
- sigmsg[16] := "SIGURG";
- sigmsg[17] := "SIGSTOP";
- sigmsg[18] := "SIGTSTP";
- sigmsg[19] := "SIGCONT";
- sigmsg[20] := "SIGCHLD";
- sigmsg[21] := "SIGTTIN";
- sigmsg[22] := "SIGTTOU";
- sigmsg[23] := "SIGIO";
- sigmsg[24] := "SIGXCPU";
- sigmsg[25] := "SIGXFSZ";
- sigmsg[26] := "SIGVTALRM";
- sigmsg[27] := "SIGPROF";
- sigmsg[28] := "SIGWINCH";
- sigmsg[29] := "SIGUSR1";
- sigmsg[30] := "SIGUSR2";
-
- new.proc := handler;
- FOR s := 1 TO NSIG - 1 DO
- IF (s <> SIGKILL)
- AND (s <> SIGSTOP)
- AND (s <> SIGTSTP) (* fuer Unterbrechnung durch ^Z *)
- AND (s <> SIGNULL)
- THEN
- (* Fuer alle Signale, ausser denen, die nicht abgefangen werden
- * koennen, einen Handler installieren.
- *)
- res := signal(s, new, old);
- END;
- END;
-
- key := Cnecin();
- END showsig.
-