home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / compiler / m2posx14 / test / showsig.mpp < prev    next >
Encoding:
Text File  |  1994-05-29  |  3.8 KB  |  147 lines

  1. MODULE showsig;
  2. __IMP_SWITCHES__
  3. __DEBUG__
  4. #ifdef HM2
  5. #ifdef __LONG_WHOLE__
  6. (*$!i+: Modul muss mit $i- uebersetzt werden! *)
  7. (*$!w+: Modul muss mit $w- uebersetzt werden! *)
  8. #else
  9. (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
  10. (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
  11. #endif
  12. #endif
  13.  
  14. #if (defined MM2) && (defined __DEBUG_CODE__)
  15. IMPORT Debug;
  16. #endif
  17.  
  18. VAL_INTRINSIC
  19. (*
  20.   Programm ist nur mit MultiTOS sinnvoll.
  21.  
  22.   Abbrechen laesst es sich entweder durch einen bel. Tastendruck oder
  23.   durch Senden eines SIGKILL (kill -9 <pid>).
  24.  
  25.   Benutzung: Waehrend das Programm auf einen Tastendruck wartet, koennen
  26.   ihm von einem anderen Programm aus Signale gesendet werden, deren
  27.   Namen ausgegeben werden.
  28.  
  29.   Unter MultiTOS kann das wie folgt geschehen:
  30.  
  31.   o Das Programm wird als TOS-Anwendung durch Doppelklick in einem
  32.     MINIWIN-Fenster gestartet.
  33.  
  34.   o Als naechstes wird in einem zweiten MINIWIN-Fenster eine Shell
  35.     gestartet. Hier wird die Prozess-Id von 'showsig' ermittelt (durch 'ps'),
  36.     worauf dann entsprechende Signale an das Programm gesendet werden
  37.     koennen ('kill -<signr> <pid>'), und 'showsig' gibt dann deren Namen in
  38.     der Form: 'SIG* handled' aus
  39.  
  40.  
  41.   29-Mai-94, Holger Kleinschmidt
  42. *)
  43. FROM SYSTEM IMPORT
  44. (* PROC *) ADR;
  45.  
  46. FROM PORTAB IMPORT
  47. (* TYPE *) UNSIGNEDWORD, UNSIGNEDLONG;
  48.  
  49. FROM OSCALLS IMPORT
  50. (* PROC *) Cnecin, Cconws;
  51.  
  52. FROM DosSupport IMPORT
  53. (* CONST*) MINSIG, MAXSIG;
  54.  
  55. FROM sig IMPORT
  56. (* CONST*) SigDfl, SigIgn, SigErr, SIGKILL, SIGSTOP, SIGTSTP, SIGNULL, NSIG,
  57. (* TYPE *) SignalHandler,
  58. (* PROC *) signal;
  59.  
  60. FROM Terminal IMPORT
  61. (* PROC *) WriteString, WriteLn, Read;
  62.  
  63. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  64.  
  65. VAR new, old : SignalHandler;
  66.     c        : CHAR;
  67.     s        : INTEGER;
  68.     key      : UNSIGNEDLONG;
  69.     res      : INTEGER;
  70.     hndlmsg  : ARRAY [0..12] OF CHAR;
  71.     sigmsg   : ARRAY [MINSIG..MAXSIG] OF
  72.                  ARRAY [0..9] OF CHAR;
  73.  
  74. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  75.  
  76. #ifdef HM2
  77. (*$E+,$K+**)
  78. #endif
  79. PROCEDURE handler ((* EIN/ -- *) sig : UNSIGNEDLONG );
  80. (* Der Signalhandler gibt einfach nur das Signal als String aus.
  81.  * Es wird direkt OSCALLS benutzt, damit keine Probleme bei nicht
  82.  * reentranten Bibliotheken entstehen.
  83.  *)
  84. BEGIN
  85.  Cconws(ADR(sigmsg[VAL(UNSIGNEDWORD,sig)]));
  86.  Cconws(ADR(hndlmsg));
  87. END handler;
  88. #ifdef HM2
  89. (*$E=,$K-*)
  90. #endif
  91.  
  92. (*===========================================================================*)
  93.  
  94. BEGIN (* showsig *)
  95.  hndlmsg    := " handled  ";
  96.  hndlmsg[8] := 15C;
  97.  hndlmsg[9] := 12C;
  98.  
  99.  sigmsg[0] := "SIGNULL";
  100.  sigmsg[1] := "SIGHUP";
  101.  sigmsg[2] := "SIGINT";
  102.  sigmsg[3] := "SIGQUIT";
  103.  sigmsg[4] := "SIGILL";
  104.  sigmsg[5] := "SIGTRAP";
  105.  sigmsg[6] := "SIGABRT";
  106.  sigmsg[7] := "SIGPRIV";
  107.  sigmsg[8] := "SIGFPE";
  108.  sigmsg[9] := "SIGKILL";
  109.  sigmsg[10] := "SIGBUS";
  110.  sigmsg[11] := "SIGSEGV";
  111.  sigmsg[12] := "SIGSYS";
  112.  sigmsg[13] := "SIGPIPE";
  113.  sigmsg[14] := "SIGALRM";
  114.  sigmsg[15] := "SIGTERM";
  115.  sigmsg[16] := "SIGURG";
  116.  sigmsg[17] := "SIGSTOP";
  117.  sigmsg[18] := "SIGTSTP";
  118.  sigmsg[19] := "SIGCONT";
  119.  sigmsg[20] := "SIGCHLD";
  120.  sigmsg[21] := "SIGTTIN";
  121.  sigmsg[22] := "SIGTTOU";
  122.  sigmsg[23] := "SIGIO";
  123.  sigmsg[24] := "SIGXCPU";
  124.  sigmsg[25] := "SIGXFSZ";
  125.  sigmsg[26] := "SIGVTALRM";
  126.  sigmsg[27] := "SIGPROF";
  127.  sigmsg[28] := "SIGWINCH";
  128.  sigmsg[29] := "SIGUSR1";
  129.  sigmsg[30] := "SIGUSR2";
  130.  
  131.  new.proc := handler;
  132.  FOR s := 1 TO NSIG - 1 DO
  133.    IF    (s <> SIGKILL)
  134.      AND (s <> SIGSTOP)
  135.      AND (s <> SIGTSTP) (* fuer Unterbrechnung durch ^Z *)
  136.      AND (s <> SIGNULL)
  137.    THEN
  138.      (* Fuer alle Signale, ausser denen, die nicht abgefangen werden
  139.       * koennen, einen Handler installieren.
  140.       *)
  141.      res := signal(s, new, old);
  142.    END;
  143.  END;
  144.  
  145.  key := Cnecin();
  146. END showsig.
  147.