home *** CD-ROM | disk | FTP | other *** search
- MODULE Spawn;
-
- (* Test und Anwendungsbeispiel fuer Modul 'proc'
- *
- * Das Programm 'SHOWCMD.TTP' muss sich in einem Verzeichnis befinden,
- * das in der Environmentvariablen PATH steht.
- *
- * hk, 05-Dez-92
- *)
-
- VAL_INTRINSIC
- CAST_IMPORT
-
- FROM SYSTEM IMPORT
- (* PROC *) ADR;
-
- FROM types IMPORT
- (* CONST*) NULL,
- (* TYPE *) WORDSET, SIGNEDWORD, UNSIGNEDWORD;
-
- FROM pSTRING IMPORT
- (* TYPE *) StrPtr, StrArray;
-
- FROM err IMPORT
- (* VAR *) errno;
-
- FROM proc IMPORT
- (* TYPE *) WaitVal, SpawnMode,
- (* PROC *) getpid, getppid, spawnvp, WEXITSTATUS, WIFSIGNALED, WTERMSIG;
-
- FROM lib IMPORT
- (* PROC *) strerror;
-
- FROM InOut IMPORT
- (* PROC *) Read, Write, WriteInt, WriteCard, WriteString, WriteLn;
-
- (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
-
- TYPE
- String = ARRAY [0..10] OF CHAR;
-
- VAR
- ret : INTEGER;
- pid : INTEGER;
- ch : CHAR;
- state : WaitVal;
- errstr : ARRAY [0..40] OF CHAR;
-
- prg : String;
- arg1 : String;
- arg2 : String;
- arg3 : String;
- arg4 : String;
- arg5 : String;
- argv : ARRAY [0..6] OF StrPtr;
-
-
- BEGIN
- WriteString("PARENT(pid = "); WriteInt(INT(getpid()), 0);
- WriteString(")"); WriteLn;
-
- prg := "showcmd";
- arg1 := "eins";
- arg2 := "ZWEI";
- arg3 := "drei";
- arg4 := "VIER";
- arg5 := "fünf";
-
- argv[0] := CAST(StrPtr,ADR(prg));
- argv[1] := CAST(StrPtr,ADR(arg1));
- argv[2] := CAST(StrPtr,ADR(arg2));
- argv[3] := CAST(StrPtr,ADR(arg3));
- argv[4] := CAST(StrPtr,ADR(arg4));
- argv[5] := CAST(StrPtr,ADR(arg5));
- argv[6] := NULL;
-
- errno := 0;
- ret := spawnvp(pWAIT, prg, CAST(StrArray,ADR(argv)));
-
- WriteLn;
- WriteString("PARENT(pid = "); WriteInt(INT(getpid()), 0);
- IF errno < 0 THEN
- WriteString("): error: ");
- strerror(errno, errstr);
- WriteString(errstr);
- WriteLn;
- ELSE
- WriteString("): child-returncode = "); WriteInt(ret, 0); WriteLn;
-
- state := CAST(WaitVal,VAL(UNSIGNEDWORD,ret));
- IF WIFSIGNALED(state) THEN
- WriteString("Terminated by Signal: "); WriteCard(WTERMSIG(state), 0);
- ELSE
- (* "WIFSTOPPED()" braucht nicht abgefragt zu werden, da "wait()"
- * keine gestopten Unterprozesse beruecksichtigt.
- *)
- WriteString("Child exit status: "); WriteInt(WEXITSTATUS(state), 0);
- END;
- END;
- WriteLn;
- Read(ch);
- END Spawn.
-
-
-