home *** CD-ROM | disk | FTP | other *** search
- MODULE ForkExec;
-
- (* Test und Anwendungsbeispiel fuer Modul 'proc'.
- *
- * Das Programm 'SHOWCMD.TTP' muss sich in einem Verzeichnis befinden,
- * das in der Environmentvariablen PATH steht.
- *
- * Programm laeuft nur unter MiNT, fuer "GEMDOS" 'Spawn' benutzen.
- *
- * hk, 16-Jan-93
- *)
-
- VAL_INTRINSIC
- CAST_IMPORT
-
- FROM SYSTEM IMPORT
- (* PROC *) ADR;
-
- FROM DosSystem IMPORT
- (* PROC *) MiNTVersion;
-
- FROM types IMPORT
- (* CONST*) NULL,
- (* TYPE *) UNSIGNEDWORD, SIGNEDWORD;
-
- FROM pSTRING IMPORT
- (* TYPE *) StrPtr, StrArray;
-
- FROM err IMPORT
- (* VAR *) errno;
-
- FROM proc IMPORT
- (* TYPE *) WaitVal, WaitOptions, WaitOption,
- (* PROC *) fork, execvp, waitpid, getpid, getppid, WEXITSTATUS, WIFSIGNALED,
- WTERMSIG, WIFSTOPPED, WSTOPSIG;
-
- 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
- pid := INT(fork());
-
- IF pid < 0 THEN (* parent *)
- WriteString("PARENT(pid = "); WriteInt(INT(getpid()), 0);
- WriteString("): ");
- strerror(errno, errstr);
- WriteString(errstr);
- WriteLn;
- ret := -1;
- ELSIF pid > 0 THEN (* parent *)
- WriteString("PARENT(pid = "); WriteInt(INT(getpid()), 0);
- WriteString("): child(pid = "); WriteInt(pid, 0);
- WriteString(") created");
- WriteLn;
- IF MiNTVersion() < 96 THEN
- REPEAT
- ret := INT(waitpid(-1, state, WaitOption{WUNTRACED}));
- UNTIL (ret < 0) OR (ret = pid);
- ELSE (* ab MiNT 0.96 ist der Pwaitpid-Systemaufruf implementiert *)
- ret := INT(waitpid(pid, state, WaitOption{WUNTRACED}));
- END;
- (* WUNTRACED: auch gestoppte Unterprozesse beruecksichtigen *)
- WriteLn;
- WriteString("-----------------------------------"); WriteLn;
- ELSE (* child *)
- 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;
-
- WriteString("CHILD(pid = "); WriteInt(VAL(INTEGER,getpid()), 0);
- WriteString("), executing: "); WriteString(prg); WriteLn;
- WriteString("-----------------------------------"); WriteLn;
-
- ret := execvp(prg, CAST(StrArray,ADR(argv)));
- END;
-
- WriteLn;
- WriteString("PARENT(pid = "); WriteInt(INT(getpid()), 0);
- IF ret < 0 THEN
- WriteString("): error: ");
- strerror(errno, errstr);
- WriteString(errstr);
- WriteLn;
- ELSE
- WriteString("): child(pid = "); WriteInt(pid, 0);
- WriteString(")-returncode = "); WriteInt(INT(CAST(SIGNEDWORD,state)), 0);
- WriteLn;
-
- IF WIFSIGNALED(state) THEN
- WriteString("Child terminated by Signal: "); WriteCard(WTERMSIG(state), 0);
- ELSIF WIFSTOPPED(state) THEN
- WriteString("Child stopped by Signal: "); WriteCard(WSTOPSIG(state), 0);
- ELSE
- WriteString("Child exit status: "); WriteInt(WEXITSTATUS(state), 0);
- END;
- END;
- WriteLn;
- Read(ch);
- END ForkExec.
-
-
-