home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / program / m2posx02 / forkexec.mpp < prev    next >
Text File  |  1993-10-23  |  4KB  |  138 lines

  1. MODULE ForkExec;
  2.  
  3. (* Test und Anwendungsbeispiel fuer Modul 'proc'.
  4.  *
  5.  * Das Programm 'SHOWCMD.TTP' muss sich in einem Verzeichnis befinden,
  6.  * das in der Environmentvariablen PATH steht.
  7.  *
  8.  * Programm laeuft nur unter MiNT, fuer "GEMDOS" 'Spawn' benutzen.
  9.  *
  10.  * hk, 16-Jan-93
  11.  *)
  12.  
  13. VAL_INTRINSIC
  14. CAST_IMPORT
  15.  
  16. FROM SYSTEM IMPORT
  17. (* PROC *) ADR;
  18.  
  19. FROM DosSystem IMPORT
  20. (* PROC *) MiNTVersion;
  21.  
  22. FROM types IMPORT
  23. (* CONST*) NULL,
  24. (* TYPE *) UNSIGNEDWORD, SIGNEDWORD;
  25.  
  26. FROM pSTRING IMPORT
  27. (* TYPE *) StrPtr, StrArray;
  28.  
  29. FROM err IMPORT
  30. (* VAR  *) errno;
  31.  
  32. FROM proc IMPORT
  33. (* TYPE *) WaitVal, WaitOptions, WaitOption,
  34. (* PROC *) fork, execvp, waitpid, getpid, getppid, WEXITSTATUS, WIFSIGNALED,
  35.            WTERMSIG, WIFSTOPPED, WSTOPSIG;
  36.  
  37. FROM lib IMPORT
  38. (* PROC *) strerror;
  39.  
  40. FROM InOut IMPORT
  41. (* PROC *) Read, Write, WriteInt, WriteCard, WriteString, WriteLn;
  42.  
  43. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  44.  
  45. TYPE
  46.   String = ARRAY [0..10] OF CHAR;
  47.  
  48. VAR
  49.   ret    : INTEGER;
  50.   pid    : INTEGER;
  51.   ch     : CHAR;
  52.   state  : WaitVal;
  53.   errstr : ARRAY [0..40] OF CHAR;
  54.  
  55.   prg    : String;
  56.   arg1   : String;
  57.   arg2   : String;
  58.   arg3   : String;
  59.   arg4   : String;
  60.   arg5   : String;
  61.   argv   : ARRAY [0..6] OF StrPtr;
  62.  
  63.  
  64. BEGIN
  65.  pid := INT(fork());
  66.  
  67.  IF pid < 0 THEN (* parent *)
  68.    WriteString("PARENT(pid = "); WriteInt(INT(getpid()), 0);
  69.    WriteString("): ");
  70.    strerror(errno, errstr);
  71.    WriteString(errstr);
  72.    WriteLn;
  73.    ret := -1;
  74.  ELSIF pid > 0 THEN (* parent *)
  75.    WriteString("PARENT(pid = "); WriteInt(INT(getpid()), 0);
  76.    WriteString("): child(pid = "); WriteInt(pid, 0);
  77.    WriteString(") created");
  78.    WriteLn;
  79.    IF MiNTVersion() < 96 THEN
  80.      REPEAT
  81.        ret := INT(waitpid(-1, state, WaitOption{WUNTRACED}));
  82.      UNTIL (ret < 0) OR (ret = pid);
  83.    ELSE (* ab MiNT 0.96 ist der Pwaitpid-Systemaufruf implementiert *)
  84.      ret := INT(waitpid(pid, state, WaitOption{WUNTRACED}));
  85.    END;
  86.    (* WUNTRACED: auch gestoppte Unterprozesse beruecksichtigen *)
  87.    WriteLn;
  88.    WriteString("-----------------------------------"); WriteLn;
  89.  ELSE (* child *)
  90.    prg  := "showcmd";
  91.  
  92.    arg1 := "eins";
  93.    arg2 := "ZWEI";
  94.    arg3 := "drei";
  95.    arg4 := "VIER";
  96.    arg5 := "fünf";
  97.  
  98.    argv[0] := CAST(StrPtr,ADR(prg));
  99.    argv[1] := CAST(StrPtr,ADR(arg1));
  100.    argv[2] := CAST(StrPtr,ADR(arg2));
  101.    argv[3] := CAST(StrPtr,ADR(arg3));
  102.    argv[4] := CAST(StrPtr,ADR(arg4));
  103.    argv[5] := CAST(StrPtr,ADR(arg5));
  104.    argv[6] := NULL;
  105.  
  106.    WriteString("CHILD(pid = "); WriteInt(VAL(INTEGER,getpid()), 0);
  107.    WriteString("), executing: "); WriteString(prg); WriteLn;
  108.    WriteString("-----------------------------------"); WriteLn;
  109.  
  110.    ret := execvp(prg, CAST(StrArray,ADR(argv)));
  111.  END;
  112.  
  113.  WriteLn;
  114.  WriteString("PARENT(pid = "); WriteInt(INT(getpid()), 0);
  115.  IF ret < 0 THEN
  116.    WriteString("): error: ");
  117.    strerror(errno, errstr);
  118.    WriteString(errstr);
  119.    WriteLn;
  120.  ELSE
  121.    WriteString("): child(pid = "); WriteInt(pid, 0);
  122.    WriteString(")-returncode = "); WriteInt(INT(CAST(SIGNEDWORD,state)), 0);
  123.    WriteLn;
  124.  
  125.    IF WIFSIGNALED(state) THEN
  126.      WriteString("Child terminated by Signal: "); WriteCard(WTERMSIG(state), 0);
  127.    ELSIF WIFSTOPPED(state) THEN
  128.      WriteString("Child stopped by Signal: "); WriteCard(WSTOPSIG(state), 0);
  129.    ELSE
  130.      WriteString("Child exit status: "); WriteInt(WEXITSTATUS(state), 0);
  131.    END;
  132.  END;
  133.  WriteLn;
  134.  Read(ch);
  135. END ForkExec.
  136.  
  137.  
  138.