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

  1. MODULE Spawn;
  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. (* Test und Anwendungsbeispiel fuer Modul 'proc'
  14.  *
  15.  * Das Programm 'showcmd.ttp' muss sich in einem Verzeichnis befinden,
  16.  * das in der Environmentvariablen PATH steht.
  17.  *
  18.  * 29-Mai-94, Holger Kleinschmidt
  19.  *)
  20.  
  21. #if (defined MM2) && (defined __DEBUG_CODE__)
  22. IMPORT Debug;
  23. #endif
  24.  
  25. VAL_INTRINSIC
  26. CAST_IMPORT
  27.  
  28. FROM SYSTEM IMPORT
  29. (* PROC *) ADR;
  30.  
  31. FROM PORTAB IMPORT
  32. (* CONST*) NULL,
  33. (* TYPE *) UNSIGNEDWORD, UNSIGNEDLONG;
  34.  
  35. FROM types IMPORT
  36. (* TYPE *) StrRange, StrPtr, StrArray;
  37.  
  38. IMPORT e;
  39.  
  40. FROM proc IMPORT
  41. (* TYPE *) WaitVal, SpawnMode,
  42. (* PROC *) getpid, getppid, WEXITSTATUS, WIFSIGNALED, WTERMSIG, spawnvp;
  43.  
  44. FROM sig IMPORT
  45. (* CONST*) SIGCHLD,
  46. (* TYPE *) SignalHandler,
  47. (* PROC *) signal;
  48.  
  49. FROM cstr IMPORT
  50. (* PROC *) strsignal, strerror, AssignCToM2;
  51.  
  52. FROM InOut IMPORT
  53. (* PROC *) Read, Write, WriteInt, WriteString, WriteLn;
  54.  
  55. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  56.  
  57. CONST
  58.   MaxArgv = 15;
  59.  
  60. TYPE
  61.   String = ARRAY [0..10] OF CHAR;
  62.  
  63. VAR
  64.   ret    : INTEGER;
  65.   pid    : INTEGER;
  66.   old    : SignalHandler;
  67.   new    : SignalHandler;
  68.   ch     : CHAR;
  69.   state  : WaitVal;
  70.   errstr : ARRAY [0..60] OF CHAR;
  71.  
  72.   idx    : StrRange;
  73.   prg    : String;
  74.   null   : String;
  75.   space  : String;
  76.   arg2   : String;
  77.   arg3   : String;
  78.   arg13  : String;
  79.   argv   : ARRAY [0..MaxArgv] OF StrPtr;
  80.  
  81. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  82.  
  83. #ifdef HM2
  84. (*$E+,$K+**)
  85. #endif
  86. PROCEDURE handler ((* EIN/ -- *) sig : UNSIGNEDLONG );
  87. BEGIN
  88.  WriteLn;
  89.  WriteString("<<<<<<<<<<<<<<<<<<<<<<<"); WriteLn;
  90.  WriteString("PARENT: SIGCHLD handled"); WriteLn;
  91.  WriteString(">>>>>>>>>>>>>>>>>>>>>>>"); WriteLn;
  92. END handler;
  93. #ifdef HM2
  94. (*$E=,$K-*)
  95. #endif
  96.  
  97. (*===========================================================================*)
  98.  
  99. BEGIN (* Spawn *)
  100.  new.proc := handler;
  101.  ret      := signal(SIGCHLD, new, old);
  102.  
  103.  WriteString("PARENT(pid = "); WriteInt(getpid(), 0);
  104.  WriteString(")"); WriteLn;
  105.  
  106.  prg   := "showcmd";
  107.  null  := "";
  108.  space := " ";
  109.  arg2  := "-2-";
  110.  arg3  := "-3-";
  111.  arg13 := "-13-";
  112.  
  113.  argv[0] := CAST(StrPtr,ADR(prg));
  114.  FOR idx := 1 TO MaxArgv DO
  115.    argv[idx] := CAST(StrPtr,ADR(null));
  116.  END;
  117.  argv[2]       := CAST(StrPtr,ADR(arg2));
  118.  argv[3]       := CAST(StrPtr,ADR(arg3));
  119.  argv[4]       := CAST(StrPtr,ADR(space));
  120.  argv[13]      := CAST(StrPtr,ADR(arg13));
  121.  argv[MaxArgv] := NULL;
  122.  
  123.  e.errno := 0;
  124.  ret     := spawnvp(pWAIT, prg, CAST(StrArray,ADR(argv)));
  125.  
  126.  WriteLn;
  127.  WriteString("PARENT(pid = "); WriteInt(getpid(), 0);
  128.  IF e.errno < 0 THEN
  129.    WriteString("): error: ");
  130.    AssignCToM2(strerror(e.errno), 0, errstr);
  131.    WriteString(errstr);
  132.    WriteLn;
  133.  ELSE
  134.    WriteString("): child-returncode = "); WriteInt(ret, 0); WriteLn;
  135.  
  136.    state := CAST(WaitVal,VAL(UNSIGNEDWORD,ret));
  137.    IF WIFSIGNALED(state) THEN
  138.      WriteString("Child terminated by Signal: ");
  139.      AssignCToM2(strsignal(WTERMSIG(state)), 0, errstr);
  140.      WriteString(errstr);
  141.      WriteLn;
  142.    ELSE
  143.      (* "WIFSTOPPED()" braucht nicht abgefragt zu werden, da "wait()"
  144.       * keine gestopten Unterprozesse beruecksichtigt.
  145.       *)
  146.      WriteString("Child exit status: "); WriteInt(WEXITSTATUS(state), 0);
  147.    END;
  148.  END;
  149.  WriteLn;
  150.  Read(ch);
  151. END Spawn.
  152.  
  153.  
  154.