(****************************************************************)
(* *)
(* Gardens Point Modula-2 Library Definition *)
(* *)
(* *)
(* (c) Copyright 1996 Faculty of Information Technology *)
(* Queensland University of Technology *)
(* *)
(* Permission is granted to use, copy and change this *)
(* program as long as the copyright message is left intact *)
(* *)
(****************************************************************)
FOREIGN DEFINITION MODULE UxProcesses;
IMPORT IMPLEMENTATION FROM "uxprocesses.o";
FROM BuildArgs IMPORT ArgPtr;
FROM Types IMPORT Int32, Card32;
PROCEDURE Fork() : Int32;
(* Spawns a duplicate process. Same as UNIX fork(2). *)
(* Returns 0 to child process, and the child's process ID *)
(* to the parent process. Returns -1 if fork unsuccessful *)
PROCEDURE Exec (path : ARRAY OF CHAR; (* absolute file name *)
argv : ArgPtr); (* the argument array *)
PROCEDURE Execp(path : ARRAY OF CHAR; (* base of file name *)
argv : ArgPtr); (* the argument array *)
(* postcondition : the process designated by path is exec- *)
(* uted in place of the current process. *)
(* Execp searches for the file on $PATH. *)
(* Only returns if file cannot be execed. *)
(* Exec ==> Equivalent to UNIX execv(2) system call. *)
(* Execp ==> Equivalent to UNIX execvp(2) system call. *)
PROCEDURE Wait(VAR result : Int32) : Int32;
(* postcondition : Waits for the termination of a child, *)
(* or the receipt of a signal. Returns -1 *)
(* for a signal, child ID for termination. *)
(* (result DIV 256) holds 0 for signal, or *)
(* exit code for termination. *)
(* (result MOD 256) holds signal number, *)
(* or zero for termination of child. *)
PROCEDURE Sleep(time : Card32) : Card32;
(* postcondition : (time - function-return-value) seconds *)
(* have elapsed. Returns early (after *)
(* signal handling) if a signal is caught *)
(* Various procedures for fetching process and parent ids *)
PROCEDURE ProcessID() : Int32;
PROCEDURE ProcessGroupID() : Int32;
PROCEDURE ParentProcessID() : Int32;
(* Various procedures for fetching user and group idents *)
PROCEDURE UserID() : Card32;
PROCEDURE GroupID () : Card32;
PROCEDURE EffectiveUID() : Card32;
PROCEDURE EffectiveGID() : Card32;
(* Typical Usage :
* FROM UxProcesses IMPORT Fork, Exec, Wait;
* FROM BuildArgs IMPORT ArgPtr, Arg3;
* FROM Types IMPORT Int32;
*
* VAR result : Int32; childId : Int32;
* ...
* IF Fork() = 0 THEN (* do child stuff here *)
* ELSE (* in the parent here *)
* childId := Wait(result);
* Exec("/usr/bin/vi",Arg3("vi","+39","uxproces.def"));
* Error("Couldn't exec vi");
* END;
*)
END UxProcesses.