Programmiersprache Pascal
Zugriff auf Betriebssystemdienste
Der Zugriff auf Betriebssystemdienste ist in Pascal standardmäßig
nicht vorgesehen.
Chancen, dennoch auf Betriebssystemdienste zugreifen zu können, ergeben
sich dann, wenn
-
das Laufzeitsystem des Pascal-Systems einen erweiterten Umfang an
Prozeduren und Funktionen zur Verfügung stellt oder
-
Assembler-Anweisungen in den Pascal-Quelltext integriert werden
können oder
-
das Laufzeitsystem eines C-Systems zur Verfügung steht und die von
Pascal- und C-Compiler erzeugten Objektcodedateien miteinander
verträglich sind.
Die Varianten 1 und 2 sind beispielsweise in Turbo Pascal nutzbar.
Die so entstehenden Lösungen sind nicht portabel.
Bei Variante 3 bestehen, in Abhängigkeit von der verwendeten
Funktionalität und den eingesetzten Sprachmittel, Chancen zu
Lösungen zu kommen, die innerhalb gewisser Grenzen portabel sind.
Beispiel 1:
Aufruf eines Befehls auf Betriebssystem-Ebene (Gnu Pascal)
PROGRAM sys(OUTPUT);
TYPE str = PACKED ARRAY[1..80] OF CHAR;
VAR cmd : str;
PROCEDURE system(VAR cmd: str); C;
BEGIN
Writeln('Start des Pascal-Programms');
cmd := 'date' + Char(0);
system(cmd);
Writeln('Ende des Pascal-Programms');
END.
Bemerkungen:
-
Eingebunden wird die Prozedur system des C-Laufzeitsystems, welche
auf Betriebssystem-Ebene die Ausführung eines Befehls
(hier date) auslöst.
-
Der Prozedur system muß als Parameter der Name des
auszuführenden Befehls übergeben werden, und zwar so, daß
der Parameter den Konventionen einer Zeichenkette in C genügt.
Es wird deshalb die Adresse übermittelt und die Zeichenkette wird
mit einer binären Null abgeschlossen.
Die Zeichenkette muß als PACKED ARRAY[...] OF CHAR
erfaßt werden. Der Typ STRING ist nicht anwendbar, da
neben der eigentlichen Zeichenkette rechnerintern auch noch
Längeninformationen abgelegt werden.
Beispiel 2:
Ausgabe der aktuellen Zeit für verschiedene Zeitzonen (Gnu Pascal)
PROGRAM timzon(OUTPUT);
TYPE str = PACKED ARRAY[1..80] OF CHAR;
PROCEDURE putenv(VAR env: str); C;
VAR ts : TimeStamp;
env : str;
BEGIN
GetTimeStamp(ts);
Writeln('Lokale Zeit : ', Time(ts));
env := 'TZ=PST0BST' + Chr(0);
putenv(env);
GetTimeStamp(ts);
Writeln('Greenwich : ', Time(ts));
END.
Verwendet wird hier die Prozedur putenv, die häfig in den
Laufzeitsystemen von C vorhanden ist und die es gestattet, auf
Betriebssystemebene eine Umgebungsvariable zu setzen.
Beispiel 3:
Übergabe von Parametern an das Programm beim Aufruf auf
Betriebssystem-Ebene
Nutzung von Umgebungsvariablen zur Parameterübergabe
Ausgabe des Wertes von Umgebungsvariablen
PROGRAM getpar(OUTPUT);
TYPE str = PACKED ARRAY[1..80] OF CHAR;
st = STRING(80);
pstr = ^str;
FUNCTION getenv(VAR env: str) : pstr; C;
PROCEDURE write_env(env: st);
{ Schreibt den Wert der Umgebungsvariablen env nach OUTPUT }
VAR par : str;
p : pstr;
i : INTEGER;
BEGIN
Write(env, ' = ');
par := env + Chr(0);
p := getenv(par);
i := 1;
WHILE ( p^[i] <> Chr(0) ) DO BEGIN
Write(p^[i]);
i := i + 1;
END;
Writeln;
END;
BEGIN
write_env('Laenge');
write_env('Breite');
END.
Bemerkungen:
-
Die Pascal-Standards blockieren die individuelle Nutzung von
Programm-Aufrufparametern durch deren (potentielle) Verwendung im
Zusammenhang mit der Dateiarbeit.
Es wird deshalb auf Umgebungsvariablen zurückgegriffen, die in
vielen Betriebssystemen zur Verfügung stehen.
-
Zur Ermittlung des Wertes einer Umgebungsvariablen wird die Funktion
getenv benutzt.
-
Innerhalb des Programms kommen drei Formen der internen Speicherung von
Zeichenketten zum Einsatz:
-
Die Namen der Umgebungsvariablen werden als STRING
übergeben.
-
Die Namen werden in ein PACKED ARRAY OF CHAR umgespeichert.
-
Den Namen wird eine binäre Null angefügt, die Adresse
des Speicherbereiches wird an die getenv übermittelt
(char * in C).
-
getenv liefert die Adresse eines Speicherbereichs, in denen der
Wert der Umgebungsvariablen als C-Zeichenkette steht.
-
Da die Pascal-Ausgabeprozedur die binäre Null am Schluß der von
getenv gelieferten C-Zeichenkette nicht als Ende-Symbol
betrachtet, muß eine eigene Ende-Erkennung organisiert werden.
Andernfalls werden soviel Zeichen ausgegeben, wie es der Pascal-Datentyp
vorsieht.
P. Böhme, 18.07.1996