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 >
Wrap
Text File
|
1993-10-23
|
4KB
|
138 lines
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.