[ Inhalt ] [ Index ] Vorausschau auf mögliche Weiterentwicklungen Referenzteil Steuerung und Fernsteuerung des

Funktionen des Servers

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.

 

Neue TCL Kommandos des VDM-Datenbankmanagers

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

  Syntax:

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

  Syntax:

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

  Syntax:

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,

  1. Das implizte Erzeugen einer neuen Sitzung, dessen Identifikationsnummer automatisch vom System vergeben wird und negativ als auch kleiner null ist.
  2. Eine Sitzung wird explizit erzeugt, der Parameter id legt die Identifikationsnummer fest. Die Nummer muß größer null sein(*). Bestehende Sessions werden überschrieben.
  3. Testen auf Existenz einer Sitzung
  4. Freigabe einer Sitzung. Die Freigabe der aktuellen Sitzung hat den Wechsel zur Standardsitzung zur Folge.
  5. Wechsel zur Sitzung id
  6. Ausgabe aller erzeugten Sitzungen
  7. Ausgabe der aktuellen Sitzung

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.

TCL-Kommandoerweiterungen des VDM-Servers

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:

  1. Es ist keine Daemon-Operation des Servers möglich. Wenn dem Prozeß, der den VDM Server startet ein Kontrollterminal zugeordnet ist, bleibt die Kopplung bestehen. Gleichfalls wird der Server nicht zum eigenen Prozeßgruppenführer. Auch anderer Eigenschaften, über die ein Daemon-verfügt werden nicht geschaffen.
  2. Ein Umleitung der Standardausgabe oder Fehlerausgabe auf eine Logdatei ist nicht möglich
  3. Der Start eines separaten Datenbankprozesses kann nicht erfolgen
  4. Die Fernwartung des Server über TELNET wird nicht unterstützt
  5. Der integrierte Debugger ist nicht aktivierbar

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.

daemon und vt

  vt <masterfd> <slavefd>

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:

Alle weiteren Eigenschaften werden mit üblichen Dämonen geteilt. Diese sind Ablauf im Hintergrund durch Abkoppeln von der Prozeßgruppe, ignorieren der Terminal I/O-Signale, Abkoppeln vom Urspungsterminal und Ignorieren des Exit-Status von Kindprozessen.

debug

  debug <level> <file>

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.

dup und pipe

    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

 

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 und ppid

       

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

 

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 und kill

   

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.

wait und waitpid

    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.


[ Inhalt ] [ Index ] Vorausschau auf mögliche Weiterentwicklungen Referenzteil Steuerung und Fernsteuerung des

VDM Class Library