Nächste Seite: DosSupport Aufwärts: Bibliotheksmoduln Vorherige Seite: DateConversions

# Detach

Mit Hilfe des Moduls `Detach` kann das aktuelle Programm einfach von der Shell abgekoppelt werden. Dieses Modul arbeitet allerdings nur unter Kickstart Version 2.0.

Das Modul `Detach` ersetzt im Grunde einen Aufruf mittels

> `"run >outfile <infile prog"`

wobei `infile` und `outfile` meist durch `NIL:` ersetzt werden. Diese Methode des Aufrufs hat jedoch den Nachteil, dass ein Programm sofort abgekoppelt ist. Oftmals sollen jedoch beim Starten anfallende Fehler- oder sonstige Meldungen noch ausgegeben werden. Man denke auch an den Syntax-Aufruf ,,`prog ?```.

Genau dies ermöglicht `Detach`. Der Aufruf der Abkoppelungs-Prozedur erfolgt erst bei Bedarf und wenn ,,alles klar`` ist. Für den Einsatz müssen folgende Voraussetzungen erfüllt sein:

- die Kickstart-Version muss mindestens 37 betragen; dies wird abgefangen.
- das Programm muss reentrant sein, dies wird allerdings nicht abgefangen!

Die Prozedur `Detach` erzeugt einen neuen Prozess mit den angegebenen Parametern. Dabei ist `name` der Kommandoname, nicht der Name des Prozesses. Der Prozessname ist immer ,,`Detached Process```. `pri` ist die Priorität im Bereich von -128 bis 127. Der Parameter `stackSize` ist die Grösse des Stacks in Byte, residentfähige Programme nehmen sich jedoch immer die beim Linken angegebene Stackgrösse! Die beiden FileHandles `input` und `output` müssen neu geöffnet sein, also keinesfalls Kopien von anderen Files. Sie werden automatisch vom System geschlossen. Sind beide identisch, wird nur einer geschlossen.

Zu beachten ist, dass beim Start von der Workbench das für Detach angegebene Fenster nicht geöffnet wird, sondern das über die Tooltypes angegebene, falls Terminal importiert wurde.

PROCEDURE DetachNorm(inname,outname:ARRAY OF CHAR);

Die Prozedur `DetachNorm` ist die einfachere Version von `Detach` und entspricht dem Aufruf

> `Detach(programName, ownPri, ownStackSize, in, out)`

Ist `outname` eine leere Zeichenkette, wird der FileHandle des Parameters `inname` übernommen.

`Detach` kehrt nur zurück, wenn das Programm von der Workbench oder als Hintergrundprozess gestartet wurde. Andernfalls, also durch normalen Shell-Start, wird das eigene Programm als Hintergrundprozess gestartet und der Urprozess durch `Arts.Terminate` beendet. Der neue Hintergrundprozess stellt nun bei seinem Aufruf von `Detach` fest, dass er kein Shell-Prozess ist und kehrt zur aufrufenden Prozedur zurück, die nun die eigentliche Arbeit des Programms beginnen kann.

Dies hört sich simpel an, musste aber wegen mangelhafter Dokumentation einiger Dos-Eigenschaften hart am Rande der Legalität programmiert werden. Insbesondere die Tatsache, dass ein Programm auch resident geladen werden kann machte das Modul relativ komplex.

Weil beide Prozesse einen Moment lang gleichzeitig auf der selben Segmentliste laufen, operieren sie auf identischen Variablen, was zum Absturz führen würde. Dies kann bei residentfähigen Programmen nicht passieren, da diese beim Start ihre eigenen Variablen anlegen.

Nächste Seite: DosSupport Aufwärts: Bibliotheksmoduln Vorherige Seite: DateConversions