Topic : TOS - das Betriebssystem Author : Version : tos.hyp (5. März 2013) Subject : Programmieren/Atari Nodes : 3001 Index Size : 93602 HCP-Version : 5 Compiled on : Atari @charset : atarist @lang : @default : Titel @help : @options : +g -i -s +x +zz -t4 @width : 70 View Ref-File5.11.3 Pexec TOS Name: »program execution« - Programm laden und ausführen. Gemdosnummer: 75 Deklaration: int32_t Pexec ( uint16_t mode, ... ); Beschreibung: Die Funktion lädt und startet ein Programm. Über den Parameter mode lassen sich verschiedene Varianten auswählen: mode Bedeutung 0 int32_t Pexec (0, int8_t *name, int8_t *cmdline, int8_t *env); Load and go: Lädt und startet das in name angegebene Programm, und übergibt die Kommandozeile cmdline. Für den Parameter env gilt: -1 = kein Environment anlegen. NULL = Environment des Parent vererben. Jeder andere Wert ist ein Zeiger auf das zu vererbene Environment. 3 PD *Pexec (3, int8_t* name, int8_t *cmdline, int8_t *env); Load, don't go: wird meist zum Starten von Overlays oder zum Laden von Programmen in einem Debugger benutzt. Entspricht mode 0, mit dem Unterschied, daß das Programm nicht sofort gestartet wird, sondern ein Zeiger auf die Basepage als LONG zurückgeliefert wird. Der Parent ist der Eigentümer des Speichers, den die Basepage und das Environment des Childs belegen und muß ihn freigeben, wenn das Child sich beendet hat. 4 int32_t Pexec (4, 0L, PD *basepage, 0L); Just go: startet ein bereits geladenes Programm. Die Basepage sollte mit mode 3 oder 5 erzeugt worden sein. 5 PD *Pexec (5, 0L, int8_t *cmdline, int8_t *env); Create Basepage: Zunächst legt GEMDOS ein neues Environment an. Dann wird der größte zusammenhängende Speicherblock alloziert und in den ersten 256 Byte eine Basepage angelegt. Für den Parameter env gilt: -1 = kein Environment anlegen. NULL = Environment des Parent vererben. Jeder andere Wert ist ein Zeiger auf das zu vererbende Environment. Unter MiNT kann dieser Mode zusammen mit mode 3 dazu benutzt werden, einen Aufruf von Pvfork ohne Blockieren des parent zu emulieren. 6 int32_t Pexec (6, 0L, PD *basepage, 0L); Just go, then free: Entspricht mode 4, mit dem Unterschied, daß allozierter Speicher dem gestarteten Prozess und nicht dem Starter gehört, so daß der Speicher, den die Basepage belegt, automatisch freigegeben wird, wenn das Child mit Pterm terminiert. Zusammen mit Modus 3 kann damit der gleiche Effekt erzielt werden, wie durch Modus 0. Dieser Modus steht erst ab GEMDOS-Version 0.15 zur Verfügung. 7 PD *Pexec (7, uint32_t prgflags, int8_t *cmdline, int8_t *env); Create Basepage, respecting prgflags: Analog mode 5, nur kann in prgflags die gleiche Information wie im Feld ph_prgflags des Programm-Headers übergeben werden. Dieser Modus wird vom BIOS des TT benutzt, um GEM zu starten, und steht erst ab GEMDOS Version 0.19 zur Verfügung. 100 int32_t Pexec (100, int8_t *name, int8_t *cmdline, int8_t *env); Load, go, don't wait: Analog mode 0, nur wartet der Aufrufer nicht, bis das gestartete Programm beendet wird, d.h. die Funktion kehrt sofort zum Parent Prozess zurück, während das Child startet. Der Rückgabewert ist ein negativer Fehlercode oder die positive PID des Childs. 101 da dieser Modus nur MagiC-intern zum Vererben von Pfad- und Dateihandles benutzt wird, wird auf die Angabe der genauen Syntax an dieser Stelle verzichtet. 102 wird MagiC-intern verwendet, um einen bestimmten Prozess zu entfernen. Auf die genaue Syntax wird daher an dieser Stelle verzichtet. 104 int32_t Pexec (104, int8_t *name, PD *basepage, 0L); Just go, don't wait: Analog mode 4, nur wartet der Aufrufer nicht, bis das gestartete Programm beendet wird. Es wird ein Prozess gestartet, dessen Basepage vorher durch einen Modus von 3, 5 oder 7 gesetzt wurde. Zu beachten ist, daß das Environment und die Basepage des Childs sich auch im Besitz des Parents befinden (tatsächlich erbt der Child allen Speicher, der sich im Besitz des Parents befindet). Der Parameter name ist ein Zeiger auf einen String, der den Namen des neuen Prozesses beschreibt; bei einem NULL- Wert wird der Name des Parent-Prozesses benutzt. Die Funktion liefert einen negativen Fehlercode, oder die positive PID des Childs zurück. 106 int32_t Pexec (106, int8_t *name, PD *basepage, 0L); Just go, don't wait, no sharing: Analog mode 104, allerdings befinden sich Environment und Basepage des Childs nicht im Besitz des Parents, und der Child hat keinen Zugriff auf Speicher, welcher dem Parent-Prozess zugeteilt wurde. Beim Beenden des Childs wird dessen Speicherplatz wieder freigegeben. In Verbindung mit Modus 3 entspricht Pexec (106, ...) daher dem Modus 100 (während Modus 3 gefolgt von Modus 6 einem Aufruf von Pexec (0, ...) entspricht). Wird ab MagiC 2.0 nicht mehr unterstützt. 107 entspricht im wesentlichen mode 7, und wird intern von MagiC verwendet. Auf die genaue Syntax wird daher an dieser Stelle verzichtet. 108 wird von MagiC intern zum Starten eines Accessories verwendet. Da die genaue Syntax offiziell nicht dokumentiert ist, sollten eigene Programme besser auf shel_write zurückgreifen. 200 int32_t Pexec (200, int8_t *name, int8_t *cmdline, int8_t *env); Replace program and go: Analog mode 100, jedoch überschreibt der neue Prozess den alten vollständig. Der alte Prozess behält zwar seine PID und die meisten seiner Attribute, aber sein gesamter Speicherplatz wird freigegeben. Während Pexec (0, ...) als Unterprogrammaufruf (call...return) angesehen werden kann, wirkt dieser Modus eher wie ein 'goto'. Hinweis: Nicht alle Modi sind unter allen Betriebssystemvarianten verfügbar; deshalb sollte der Rückgabewert der Funktion beachtet werden. Unbekannte Modi sorgen für ein Funktionsergebnis von EINVFN. Kommandozeilen werden als String im Pascal-Format übergeben, d.h. im ersten Byte befindet sich die Länge der Zeile (maximal 124 Zeichen). Ergebnis: Die Funktion liefert als Ergebnis den Abschlußcode des Child-Prozesses. Wenn ein Overlay geladen wurde, enthält das Ergebnis die Basepage des Overlays. Bei einem negativen Resultat ist ein Fehler aufgetreten. Verfügbar: Alle GEMDOS Versionen. Gruppe: Prozessfunktionen Querverweis: Binding shel_write Programmflags ARGV-Verfahren