Eine Erweiterung der Funktionalität des Datenbankmanagers zur Schaffung eines Servers wurde in zweierlei Hinsicht vorgenommen. Zum einen wurden Funktionen dem Kern des Managers(*) hinzugefügt, wie im theoretischen Teil der Diplomarbeit besprochen wird. Zum anderen geschah die Aufnahme systemspezifischer Kommandos in die TCL-Shell, die auf der POSIX-Norm basieren, und daher in der Regel ein UNIX System voraussetzen.
Bei der Entwicklung des Systems wurde zunächst versucht, viele einzelne POSIX-konforme Funktionen in die TCL-Shell einzubetten, um aus diesen einen Server-Daemon zu konstruieren. Als die Umsetzung dieses Vorhabens zu Auswüchsen des TCL-Codes als auch C-Codes führte, fiel der Entschluß, diese Kommandos in einem Befehl zu konzentrieren. Viele der bereits umgesetzten Kommandos wurden ersatzlos gestrichen, und neue Befehle auf ein überschaubares Minimum reduziert.
Zunächst werden die Neuzugänge der Funktionen, die im Hochsprachencode des Datenbankmanagers erstellt sind, dokumentiert. Sie füllen Lücken in der Funktionalität aus und erlauben den Zugang zu der Multisessionfähigkeit.
directimport <flatformat>
Das directimport Kommando erlaubt das Importieren in die Datenbank äquivalent zum ursprünglich bestehenden Befehl import. Bisher war der Import in die VDM Datenbank aus einer Datei mit FLAT-Struktur(*) lediglich durch explizite Angabe eines Dateinamens möglich. directimport gestattet die Aufnahme aus einem TCL-String heraus, der äquivalent zum Inhalt einer FLAT-Exportdatei ist. Als boolscher Funktionswert wird der Erfolg des Imports durch das Kommando zurückgegeben.
Das Kommando directimport wurde benötigt, um Dateiinhalte, die vom Server über das Netzwerk empfangen werden und von den Klienten stammen, importieren zu können.
exportformat <adt> <impl> <oper> <comp> <value>
Ebenso wie directimport für das Arbeiten im Netzwerk erforderlich ist, gilt dies auch für das neue Kommando exportformat. Der Export von Datenbankinhalten mittels export oder partialexport wird im Gegensatz zu den konventionellen Importfunktionen als Funktionswert zurückgegeben, die Inhalte stammen aus der Datenbank. exportformat erzeugt aus der TCL-Zeichenkette value sowie den Parametern adt, impl, oper und comp, die das Element bezeichnen, das gleiche Ausgabeformat. Der Import von Komponenten über das Netzwerk wird durch Erzeugung dieses Formats mit anschließendem Import mittels directimport auf dem Server durchgeführt.
session create
session create <id>
session exists <id>
session release <id>
session <id>
session list
session
session help
Die Bedeutung und Theorie der Multisessionfähigkeit des Servers ist im Zusammenhang mit dem Kontextwechsel unter [*] erläutert. Die hiesigen Funktionen sind äquivalent. Der Zugang zu diesen Funktionen erfolgt über das neu definiert TCL-Kommando session. Eine Online-Hilfe kann mit session help abgerufen werden.
Die Semantik der weiteren Kommandos ist, in der Reihenfolge ihres Auftretens in der Syntaxbeschreibung,
Das Sitzungskommando wird auschließlich vom jeweiligen Benutzer-Agenten (user agent), der auf dem Server mit der Aufnahme der Verbindung durch einen Klienten eingerichtet wird, und alleiniger Ansprechpartner des Klienten ist, bedient. Der Agent richtet die Sitzung für den neuen Klienten ein, arrangiert den Wechsel zu ihm bei Anfragen als auch den Rückwechsel zum vorhergehenden und gibt die Sitzung wieder frei, sobald die Klientverbindung abbricht, beendet wird oder ein Ausnahmezustand auftritt.
Da der Agent über Ereignissteuerung agiert, verfügt dieser bei seiner Aktivität über einen eigenen TCL-Interpreter. Die Eingabe des Sitzungskommandos session über die Fernwartung oder vom Terminal aus zu Testzwecken ist durchaus zulässig und unschädlich. Das Löschen von Sitzungen hat den Abbruch des Klienten beim nächsten Zugriff zur Folge.
Bei der Implementierung der Serverfunktionalität wurde dafür Sorge getragen, daß der VDM Server auch ohne jegliche systemspezifische Funktionen auskommt und lauffähig ist. Dies auch im Hinblick auf eventuelle zukünftige Portierungen auf andere Plattformen, auf denen TCL durchaus lauffähig ist, die verwendeten speziellen UNIX-Funktionen unter Umständen jedoch nicht.
Bei einem Verzicht auf die Erweiterungsfunktionen ergeben sich jedoch fünf Einschränkungen:
Alle TCL-Kommandos wurden aufgrund ihrer Kürze in C erstellt. Der Grund hierfür liegt ferner in dem Verzicht auf objektorientierte Programmierung durch die Ersteller der Tool Command Language und der damit verbundenen Förderung der Einheitlichkeit. Der Code ist nach [GL95] Lehey, Greg: Porting UNIX Software, 1995 portabel programmiert, und sollte sowohl für alle Releases von System V als auch BSD sowie Linux, was die Funktionen beider Derivate beinhaltet, gültig sein. Auch die Besonderheiten von SUN-OS wurden berücksichtigt. Praktisch getestet werden konnten lediglich SUN-OS als auch Linux. Der Quellcode befindet sich unter ./tools/g++vdmdbm/cmds der Installation der Klassenbibliothek.
Der Befehl vt öffnet ein Pseudoterminal auf dem Host. Ein Pseudoterminal ist ein Gerätepaar, daß aus Master und Slave besteht, und sich wie ein Terminaldevice verhält. Ohne Pseudoterminals (PTY) ist eine Fernanmeldung auf UNIX-Hosts über das Netzwerk nicht möglich, daher sind sie in allen bekannten UNIX-Derivaten verfügbar. Das Gerätepaar eines PTY bezieht sich auf ein und dasselbe Gerät. Während der Master das Kontrollterminal des jeweiligen Prozesses ist, wird der Slave über das Netzwerk bedient. Detailierte Informationen über Pseudo-Terminals gibt Stevens in [RS92] [RSE92] und [RS95]. Die Funktion vt öffnet ein ein PTY und setzt das Master- als auch Slave-Device als TCL Dateideskriptor in die übergebenen Parametern ein. Der vt Befehl wird vom Hypertext Informations- und Hilfesystem nicht direkt, sondern lediglich über das daemon-Kommando verwendet.
daemon [masterfd] [slavefd]
Über die Funktionsweise von Daemonen (daemon) gibt [RS92] Stevens Auskunft. Typische Eingenschaften eines Daemon-Prozesses sind:
Der neugeschaffene Daemon-Befehl für TCL verwandelt die laufende TCL-Shell mit sofortiger Wirkung in einen Daemon-Prozeß. Im Gegensatz zu üblichen Daemonen wird hierbei ein virtuelles Kontrollterminal zugewiesen, dessen Master- und Slave-Device als TCL-Dateideskriptor in die übergebenen TCL-Variablen gesetzt werden, sofern diese angegeben werden. Von dieser Option wird vom VDM Server jedoch nicht Gebrauch gemacht, da lediglich Kommandozeilen bedient werden müssen.
Die Unterschiede, die zu üblichen Daemon-Prozessen und solchen Prozessen, die mit daemon gestartet werden, bestehen sind im Wesentlichen wie folgt:
debug on
debug off
debug stop
Der VDM Server verfügt über einen eigenen Debugger, der in der Lage ist, den gesamten Ablauf der TCL-Programme mit allen Substitutionen aufzuzeichnen. Die Einreichtung des Debuggers wird durch Aufruf des Kommandos mit Angabe der Debugtiefe (level) und der Ausgabedatei (file) durchgeführt, er wird jedoch nicht gestartet. Erst mittels debug on wird die Aufzeichnung aktiviert und mit debug off beendet. Durch Einrahmen von TCL-Codesequenzen durch diese Befehle können gezielte Bereiche untersucht werden. Die Debugtiefe level legt fest, bis zu welcher Rekursionstiefe die Aufzeichnung vorgenommen werden soll. Sie ist äquivalent zu der Tiele, die mit dem TCL-Befehl uplevel #level cmd festgelegt wird. Bei Programmende oder durch debug stop wird die Aufzeichnung beendet.
Die UNIX Systemfunktioonen dup und pipe zählen zu den Schlüsselkommandos. Ohne diese Funktionen wäre die gesamte Kommunikation, die Konstruktion von Filtern und die Kommunikation von Prozessen undenkbar. Beide Funktionen waren in älteren Versionen als 7.4 von TCL zwar unkommentierte Funktionen, aber definiert. Sie wurden jedoch später vermutlich aufgrund der erweiterten Portabilität entfernt, und daher vom Autor neu geschaffen.
dup <oldfd> <newfd>
dup oldfd
pipe
Das dup Kommando mit der Angabe von zwei Dekriptoren entspricht in seiner Funktion der dup2-Systemfunktion von UNIX. Der Deskriptor oldfd wird auf newfd dupliziert und newfd dabei nötigenfalls geschlossen. Beide Deskriptoren bezeichnen ein und dieselben Kanal. Das dup Kommando ist mit der dup Systemfunktion identisch und dupliziert den Quellkanal implizit auf den kleinsten geschlossenen Kanal. Dieser wird zurückgegeben.
Das pipe Kommando erwartet keine Parameter und gibt zwei TCL-Deskriptoren als Liste zurück, die eine Pipe definieren. Der erste Deskriptor ist lediglich lesbar, der zweite lediglich beschreibbar(*). Prozesse kommunizieren miteinander, indem nach Aufruf der fork-Funktion der eine Prozeß die Eingabeseite, der andere die Ausgabeseite schließt und die jeweils andere Seite zum Lesen bzw. zum Schreiben verwendet wird. Pipes werden durch Aufruf von Kindprozessen vollständig verererbt, wozu vom Kernel das dup Kommando verwendet wird.
fork
Mit fork werden Kindprozesse gestartet. Ein Rückgabewert von 0 bedeutet, daß es sich um den Kindprozeß handelt. Der Vaterprozeß erhält die Prozeßnummer des Kindprozesses als Ergebnis.
getgid
getuid
setpgrp
ppid
Diese Funktionen werden vom VDM Server nicht mehr verwendet, sind aber implementiert und beziehen sich auf die (effektive) Gruppen-, (effektive) Benutzeridentifikation als auch das Setzen des Prozeßgruppenführers als auch die Rückgabe der Prozeßnummer des Vaterprozesses in Ergänzung des pid Kommandos von TCL. Im weiteren wird auch die Handbuchseiten von UNIX verwiesen.
reopen <fname> <mode> <file> <w|r>
Der neugeschaffene TCL-Befehl reopen ist vergleichbar mit der UNIX-Systemfunktion freopen, jedoch nicht identisch. Er erlaubt das Umleiten eines TCL-Dateideskriptors, der mit file angegeben wird, auf eine Datei mit durch mode definiertem Zugriffsmodus, der gleiche Werte akzeptiert, wie das open Kommando von TCL.
Der reopen-Befehl wird vom VDM Server zur Umleitung der Standardausgabe als auch -fehlerausgabe in eine (Log-)datei verwendet. Dies ist auch für die Standardeingabe möglich, wenn eine Datei als FIFO erzeugt, und in diese von anderer Stelle geschrieben wird. Abhängig von Richtung der Umleitung muß w oder r angegeben werden. Die Umleitung der Standardeingabe wurde mit Schaffung der Fernwartung überflüssig.
signal
signal <signum>
signal <signum> [sigaction | SIG_IGN | SIG_DFL]
kill
kill <signum> <pid>
Die Kommandos signal und entstammen auch dem Satz der UNIX-Funktionen. Während kill ebensogut auch als externes Programm aufgerufen werden könnte, erlaubt signal die asynchrone Ausführung von TCL-Befehlen als Reaktion auf ein externes Signal. Der parameterlose Aufruf von signal oder kill zeigt alle auf dem jeweiligen UNIX-Host gültigen Signale an. Der Aufruf mit einem Signal gibt den für dieses Signal hinterlegten TCL-Code zurück. Die verbleibende Syntax erlaubt die Hinterlegung des Codes, als auch die Festlegung, ob das Signal ignoriert oder die Standardbehandlung aktiviert werden soll.
Der Signalverarbeitung kommt durch den VDM Server lediglich eine Bedeutung bei der Ausführung der externen Beispiele als Daemon zu, die ein Setzen auf die Standardbehandlung erforderlich macht, da die Beendigung von Prozessen ansonsten von der TCL-Shell nicht erkannt wird. Das kill Kommando wird zur Sicherung der Terminierung eines externen Datenbankprozesses verwendet.
Zur Überwachung von Kindprozessen kommen unter UNIX viele Möglichkeiten in Betracht, die auch vom Derivat abhängig sind. Kindprozesse, deren Elternprozeß terminiert ist, ohne daß dieser den exit-Status erfragt hat, werden als sogenannte Zombies, also lebende Tote, bezeichnet (was hiermit nur vereinfachend dargestellt ist). Die folgenden Kommandos wait und waitpid stellen nur eine Möglichkeit dar, Zombie-Prozesse zu vermeiden, und sind funktional mit den gleichnamigen UNIX-Systemfunktionen identisch.
<wait>
<waitpid> <pid>
Das wait Kommando wartet auf die Beendigung aller Kindprozesse, der waitpid Befehl ist differnenziert auf einen bestimmten Prozeß(*), auf den nicht gewartet, sondern für den im voraus bestimmt wird, daß der Exitstatus als bereits abgefragt gilt. Da die Überwachung von Kindprozessen im fork-Kommando der TCL-Shell mittels Tcl_ReapDetachedProcess bereits integriert ist, werden weder wait noch waitpid weiter verwendet, können aber dennoch nützlich sein und sind deshalb weiterhin definiert.