MiNT-Grundlagen, Teil 4

Im vorerst letzten Teil unseres MiNT-Kurses vertiefen wir einige Dinge anhand von konkreten Anwendungen.

Wir gehen davon aus, daß Sie sich inzwischen mit der MiNT-Shell auskennen. Bestimmte Mechanismen (Pipes, Ein/Ausgabeumlenkung etc.) werden in diesem Teil als bekannt vorausgesetzt. In der letzten Ausgabe wurden die sogenannten Jobs erklärt. Diese sind aber nur für jede Shell lokal sichtbar. Um Informationen über die anderen Prozesse im System zu bekommen, gibt es verschiedene Utilities. Eines davon ist »ps«. Geben Sie in der MiNT-Shell einmal diesen Befehl (ohne Parameter) ein. Es erscheint dann eine Liste mit den im Speicher befindlichen Prozessen. Die folgende Beschreibung bezieht sich auf »PS.TTP«, das dem MiNT-Paket beiliegt. Andere Implementationen unterscheiden sich etwas.

Unter »PID« sind die IDs der im Speicher befindlichen Prozesse aufgelistet. Die Spalte unter »PPID« gibt dabei die ID des Vaterprozesses (Parent) an. Das ist der Prozeß, von dem aus das jeweilige Programm gestartet wurde. »PRI« gibt die Priorität an, die dem Prozeß zugeteilt wurde. Diese kann entweder beim Start bestimmt als auch nachträglich geändert werden. Die aktuelle Priorität wird unter »CURRPRI« angezeigt. Diese kann von »PRI« natürlich abweichen und wird von MiNT errechnet.

Prozesse können verschiedenen Status haben: »Ready« bedeutet, daß der Prozeß bereit ist und darauf wartet, den Prozessor benutzen zu können. Bei »Wait« wartet der Prozeß in der Regel auf ein Ereignis. »Sleep« bedeutet, der Prozeß wartet auf eine Eingabe (Konsole oder Datei). Unter »Size« wird der Speicherverbrauch eines Prozesses angezeigt und unter »Time« die Laufzeit. Am Ende der Zeile sind der Prozeßname und die übergebenen Parameter zu finden. Da MiNT preemtives Multitasking mit Prioritäten bereitstellt, können diese natürlich eingestellt bzw. verändert werden: Mit dem Befehl »nice« kann diese direkt beim Start des Prozesses angegeben werden. Dabei wird die Priorität als Differenzwert zur aktuellen (beim Start 0) Priorität angegeben. Die Zeile

	nice -5 ls

startet den Befehl »ls« mit der Priorität 0-5 (= -5). Der Strich leitet dabei die Funktion ein, der Zahlenwert ist also +5. Da die Differenz gefragt ist, wird dieser Wert von der vorherigen Priorität abgezogen. Möchten Sie die Priorität um 5 erhöhen, müssen Sie »- - 5« eingeben. » -« leitet dabei wieder die Funktion ein, der Wert ist »- 5« (0-(-5) = 0+5 = 5). Negative Zahlen erhöhen also die Priorität. Die Priorität des Vaterprozesses wird beim Start eines Sohnprozesses an diesen vererbt. Hat die Shell also die Priorität -10, bekommen auch alle anderen Prozesse, die aus dieser Shell dann gestartet werden, diese Priorität. Um die Priorität nachträglich zu ändern, brauchen Sie zunächst einmal die Prozeß-ID (mit »ps« ermitteln). Um diese nun beispielsweise von Prozeß 3 um 5 zu erhöhen, müssen Sie folgende Zeile eingeben:

	renice -5 3

Wenn Sie jetzt die Prozesse mit »ps« auflisten, sehen Sie, daß unter »PRI« der neue Wert steht. Wie auch »ps«, unterscheiden sich die beiden Utilities »nice« und »renice«, die dem MiNT-Paket beiliegen, vom Standard. Sie wurden zudem auf das Wesentlichste beschränkt, was aber im Allgemeinen völlig ausreicht.

Neben den Utilities »ps«, »nice« und »renice« gibt es »top«. Dies ist ein richtiges Programm, mit dem interaktiv gearbeitet werden kann und das eigentlich mehrere Programme enthält. In diesem Fall ist es auch nicht sinnvoll, »top« über die MiNT-Shell zu starten, sondern über einen Doppelklick im Desktop (nur AES 4.0) bzw. dem Menüpunkt »Open Std. Window« in »TOSWIN«. Damit wird nämlich ein neues Fenster benutzt und die Shell ist nicht blockiert. Befindet sich die Datei »TOPMNU« im Verzeichnis von »TOP.TTP«, kann dieses Utilitiy auch über das Application Menü bedient werden. Großbildschirmbenutzer können zudem »top« auch ständig online installiert haben, da es wenig Rechenzeit verbraucht. Die Werte werden regelmäßig aufgefrischt, d.h. auch neu gestartete Prozesse werden angezeigt. Sie haben so immer den Überblick über Ihr System. Die Informationen, die von »top« angezeigt werden, sind denen von »ps« sehr ähnlich und bedürfen daher eigentlich keiner erneuten Beschreibung. Mit der Taste »H« erscheint eine ganz kurze Hilfe, die anzeigt, welche Kommandos auf welcher Taste liegen. Mit »P« können Sie zwischen der »PPID«-und der Prioritätsanzeige umschalten. Um die Priorität zu ändern, drücken Sie »R« (renice), geben die Priorität (hier jedoch ohne Strich), danach die »PID« ein und drücken »RETURN«. Mit »K« (kill) können Sie einen Prozeß beenden. Dabei müssen Sie die »PID« mit angeben. Um »top« zu beenden, geben Sie »Q« ein. Programme zum Prozeßmanagement wie »top« wird es in absehbarer Zeit wohl auch mit GEM-Oberfläche geben. Es würde dann in gewisser Weise auch die Utilities »ps«, »renice« und »kill« ersetzen.

Eines der mächtigsten Utilities unter Unix stellt das Kommando »find« dar. Damit können Sie Dateien nach allen nur erdenklichen Merkmalen suchen lassen. Da sich »find« mit anderen Befehlen verknüpfen läßt, öffnen sich schier unendlich viele Möglichkeiten und Anwendungen. Leider ist dieses Kommando auch sehr komplex, so daß hier nur die wichtigsten Anwendungen und Optionen besprochen werden können: »find« erwartet zunächst den Startpfad und danach die Funktionen und Kriterien, nach denen gesucht werden soll. Um beispielsweise alle BAK-Dateien auf Laufwerk D: zu suchen und anzeigen zu lassen, müssen Sie folgende Zeile eingeben:

	find d: \ -name '*.BAK' -print

Hinter »-name« erwartet »find« eine Dateinamenangabe. Dieser muß in Anführungszeichen gesetzt (gequotet) werden, damit er nicht schon vorher von der Shell expandiert wird. »-print« sagt, daß »find« die Dateien mit Pfadangabe auch anzeigen soll, ansonsten »denkt« sich dieses Utility nur das Ergebnis. Nun sollen die BAK-Dateien aber auch gleich gelöscht werden. Dazu geben Sie

	find d:\ -name '*.BAK'-exec rm -i {}';'

ein. »-print« wurde hier durch die »-exec«-Funktion ersetzt. Da diese Konstruktion nicht ganz trivial ist, bedarf sie einer genaueren Beschreibung: »rm« ist das Kommando zum Löschen der Datei. Der Schalter »-i« sagt dabei, daß vor dem Löschen der Datei nachgefragt werden soll. Bei diesem Beispiel sollte man vorsichtig sein, da man schnell Daten löschen kann. Die geschweiften Klammern repräsentieren den von »find« gefundenen Dateinamen. Das Semikolon in Anführungszeichen zeigt das Ende der »-exec«-Funktion an. Statt »-exec rm i...« kann auch » -ok rm ... « eingesetzt werden. Die Sicherheitsabfrage wird dann von »find« übernommen. Beim Suchen mit »find« kann u.a. auch die Dateiart oder das Datum bzw. das Alter der Datei mit einbezogen werden. Darüber hinaus können auch Verknüpfungen hergestellt werden (z.B. alle Dateien, die auf das Muster »*.C« passen und älter als 10 Tage sind). Für weitere Details verweisen wir auf [1] und auf die Anleitung (bzw. MAN-Page) zu »find«. Die ZOO-Version 2.1 (nicht zu verwechseln mit 2.01) erlaubt es nicht, Verzeichnisse rekursiv zu packen. Man ist also gezwungen, jeden einzelnen Dateinamen mit Pfadangabe anzugeben. Teilweise läßt sich das durch Benutzen von Wildcards umgehen, jedoch werden Ordner und deren Inhalte hier nicht berücksichtigt. Mit dem Utiltiy »find« stellt das jedoch kein Problem dar. Die Zeile

	find. -type f -print | zoo aPI archiv

sucht zunächst alle Dateien ab dem aktuellen Verzeichnis (der Punkt). Der Schalter »-name« kann dabei weggelassen werden. Sollen nur bestimmte Dateien archiviert werden, muß dieser natürlich hinzugefügt werden. Wichtig ist nur, daß die Suche auf Dateien beschränkt wird, da »zoo« bei Ordnern einen Fehler melden würde. Das wird mit »-type« erreicht. »f« steht dabei für Dateien. Die Ausgabe wird nun über die Pipe (» | «) mit dem Archivierer verknüpft. Die Schalter »aP« steht dabei für »Dateien hinzufügen und packen« und »I« sagt »zoo«, daß die zu packenden Dateinamen über die Standardeingabe (in diesem Fall die Pipe) gelesen werden sollen.

	zoo x// archiv

veranlaßt »zoo«, die Dateien mit der Verzeichnis-Struktur wieder auszupacken. Den Archivinhalt können Sie sich mit »zoo v archiv« anzeigen lassen.

»Nur Feiglinge machen Backups«? Das ist eher eine Ausrede für Faulheit. Mit dem Utility »tar« können Sie schnell und einfach Backups auf einen Streamer oder eine andere Partition (z.B. eine Wechselplatte) machen. »tar« (TApe Archiver) wurde ursprünglich für Streamer bzw. Tapes programmiert, kann aber auch das Archiv als normale Datei auf Fest- oder Wechselplatte schreiben. Um diesen Fall dreht es sich nun primär. Wir benutzen für unsere Backups den GNU-tar (»gtar«). Die von Eric Smith portierte Version hat leider einige Macken. Die Kommandozeile, um das Laufwerk C: mit »gtar« zu archivieren, lautet dabei:

	gtar -cvb 64 -f g:\backup.tar c:\*

Der Schalter »c« steht dabei für »Neues Archiv erzeugen« und »v« sagt, daß »gtar« anzeigen soll, welche Datei gerade bearbeitet wird »b« legt die sogenannte Blockgröße in n*512 Bytes fest. »gtar« schreibt die Daten erst auf die Platte, wenn diese Grenze überschritten wurde. Je größer der Wert ist, umso höher ist der Datendurchsatz. In diesem Fall ist der Puffer 64 * 512 = 32 KByte groß. Dieser Wert reicht beim Backup-Vorgang auch vollkommen aus. Der Archivname ist schließlich hinter dem Schalter »f« zu finden. Im Beispiel wird das Archiv auf Laufwerk G: angelegt. Wenn Sie den Schalter »c« durch »t« ersetzen, können Sie sich den Archivinhalt anzeigen und das Archiv testen lassen. Der Schalter »x« veranlaßt das Programm, das Archiv im aktuellen Verzeichnis wieder auszupacken. In den letzten beiden Fällen kann die Blockgröße auch höher gewählt werden (z.B. 256). »gtar« arbeitet auch mit einem anderen Programm zusammen: »compress«. Hier handelt es sich um einen Online-Packer, der auch Eingaben über Standardeingabe komprimieren kann. »tar« macht sich dies zunutze, indem es seine Ausgaben über eine Pipe vorher durch »compress« schickt. Man erhält so ein komprimiertes TAR-Archiv. Dieser Modus wird durch den Schalter »z« aktiviert. Die Zeile, um das Archiv von oben in komprimierter Form zu erzeugen, lautet:

	gtar -cvzb 64 -f g:\backup.taz c:\

Als Endung für das Archiv wurde hier ».taz« benutzt, um anzuzeigen und unterscheiden zu können, daß dieses Archiv komprimiert wurde. Beim Entpacken und Anzeigen muß die »z«-Funktion ebenfalls mit angegeben werden. An dieser Stelle möchten wir hinzufügen, daß es früher oder später wohl sog. Device-Treiber für Streamer unter MiNT geben wird und es dann möglich ist, das Backup auf dieses Medium zu schreiben. Theoretisch könnte man über ein zusätzliches Utility (»at«) den Backup-Vorgang automatisieren, indem er regelmäßig (z.B. jeden Tag um 18.00 Uhr) gestartet wird. Leider haben wir dieses Utility für den Atari bis jetzt noch nicht entdecken können. »TeX« und »METAFONT« sind beides sehr langwierige Prozesse, besonders auf weniger »betuchten« Rechnern. Praktisch wäre, wenn diese in den Hintergrund gelegt werden könnten, um so nicht den ganzen Rechner zu blockieren. In beiden Fällen kommt es eigentlich nur darauf an, daß das Environment richtig gesetzt ist (s. Kasten). Darüber hinaus muß auch »PATH« um das BIN-Verzeichnis von TeX und METAFONT erweitert werden. Dann können Sie TeX und METAFONT einfach aus der MiNT-Shell heraus starten. Als praktisch hat sich folgendes Alias erwiesen, welches in die Datei »MINTSHEL.RC« mit aufgenommen werden sollte:

	alias latex "tex ‚&latexg'"

Diese Zeile gilt für die TeX-Implementation von Christoph Strunk. Andere Implementationen benutzen statt »&latexg« oft auch »&lplaing«. Das erste Alias muß daher gegebenfalls noch angepaßt werden. Um nun den TeX-Lauf zu starten, wechseln Sie mit »cd« einfach in das Verzeichnis, in dem die TeX-Datei zu finden ist. Geben Sie nun

	latex datei

ein, um den eigentlichen Prozeß zu starten. Leider ist so aber die Shell für diesen Zeitraum blockiert, was natürlich unpraktisch ist. Wir könnten jetzt den Prozeß in den Hintergrund legen. Da wir aber auch die Ausgabe umlenken müssen, würden Fehler nicht mehr ohne weiteres bemerkt. Es empfiehlt sich daher, eine zweite Shell unter TOSWIN zu starten, in der dann TeX läuft. Bei METAFONT hingegen ist es durchaus sinnvoll, diese in den Hintergrund zu legen und die Ausgabe umzulenken, da beim Erzeugen der normalen Zeichensätze keine Fehler auftauchen sollten. Beispiel:

	mf ‚&cm \mode=atari;
	mag=1.728; input cmrl0'
	>u:\dev\null &

Der Zeichensatz, die Basis, etc. müssen natürlich für den gewünschten Font angepaßt werden. Die Ausgabe wird dabei ins Nirvana umgeleitet. Weiterhin muß der Font mit »gftopk« gepackt werden. Bei METAFONT empfehlen wir aber, die jeweilige TeX-Shell zu benutzen, da diese alles automatisch (richtig) macht. Jedoch unterstützen die uns bekannten noch kein »MultiTOS«, was sich aber in nächster Zeit mit Sicherheit ändern wird. Falls der TeX-Prozeß den Rechner zu sehr bremst, können Sie mit »renice« dessen Priorität verkleinern. Möchten Sie TeX immer mit einer bestimmten Priorität laufen lassen, so ändern Sie das »latex«-Alias einfach in

	alias "nice -priorität tex '&latexg'"

»priorität« ist dabei durch eine Zahl zu ersetzen. Im zweiten Teil des Kurses war in »MINT.CNF« eine Zeile enthalten, die ein Programm »lpd« mit »bg« in den Hintergrund legt. Hier handelt es sich um eine Art Druckerspooler. Dieser hängt jedoch nicht in den Systemvektoren, sondern wird über eine FIFO-Pipe (LPD.MSG) angesprochen. Um über diesen Spooler eine Datei auszudrucken, braucht man das Programm »lpr«, das »lpd« mitteilt, daß die angegebene Datei in die Warteschlange eingefügt und ausgedruckt werden soll. Die Datei befindet sich jedoch nicht im Speicher, sondern es wird eine Kopie auf der Festplatte (TMP-Verzeichnis) erzeugt und von dort nach und nach gelesen. Daher benötigt dieser Spooler nur wenig Speicher.

Ein Sache ist wichtig: Da bei Multitasking mehrere Prozesse gleichzeitig auf ein und dieselbe Datei zugreifen können, ist natürlich Vorsicht geboten. Es existiert zwar ein Schutzmechanismus (File/Record-Locking), den aber bis jetzt nur wenige Programme unterstützen. Sie sollten daher keine Dateien löschen oder verändern, die z. Zt. bearbeitet werden. Im alten Desktop darf darüber hinaus auch kein »ESC« zum Auffrischen des Dateifensters benutzt werden, da hier alle Dateien auf dem jeweiligen Laufwerk geschlossen werden (erzwungener Medienwechsel). Prozesse, die auf diesem Laufwerk tätig waren, bekommen dann ernsthafte Probleme und es kann zu Datenverlust kommen. Im Desktop des AES 4.0 wurde dieser Umstand jedoch beseitigt. Wir sind am Ende unseres Kurses angekommen. Es gibt einige Dinge, die nicht erklärt wurden, obwohl sie unter Unix wichtig sind. Das liegt ganz einfach daran, daß MiNT zwar viele neue Möglichkeiten bietet, diese zum größten Teil aber noch nicht ausgeschöpft werden. Beispiele wären hier einfach zu abstrakt bzw. nicht möglich gewesen. Wir glauben aber, daß sich im Laufe des Jahres einiges in dieser Richtung tun wird. Für Programmierer bieten wir eine kleine Checkliste, die für »MiNT« und »MultiTOS« sehr wichtig ist! (uw)

[1] Jürgen Gulbins, »UNIX, Version 7, bis System V.3«, 3. Auflage Springer-Verlag, ISBN 3-540-19248-x Die wichtigsten Befehle im Überblick

Anmerkungen zur verwendeten Syntax:

<bezeichnung>	steht für einen Parameter
-Buchstabe(n)	repräsentiert die möglichen Optionen.
[...]	steht für optionale Ausdrücke.

find <verzeichnis> <optionen>
sucht nach Dateien ab dem in <verzeichnis> angegebenen Verzeichnis. Optionen können u.a. sein:

-name <muster> sucht nach einem Namensmuster.
-type <typ> beschränkt die Suche auf bestimmte Dateitypen (»f« für Dateien; »d« für Directories).
-print listet die gefundenen Dateien auf
-exec <befehl>; startet für jede gefundene Datei das Kommando <befehl>. Die »-exec«-Option wird durch ein (gequotetes) Semikolon abgeschlossen. Der Dateiname steht in {}.
-ok <befehl>; wie »-exec« mit dem Unterschied, daß vor der Ausführung von <befehl> nachgefragt wird.

lpr <datei>
sagt dem Drucker-Dämon »lpd«, daß es die Datei <datei> in seine Warteschlange einfügen und ausdrucken soll.

nice -<priorität> <befehl> [<parameter>]
Startet einen Befehl <befehl> mit der Priorität 0 - <priorität> und den optionalen Parametern <parameter>.

ps
zeigt alle im Speicher befindlichen Prozesse an. Andere »ps«-Implementationen kennen noch weitere Parameter.

renice -<priorität> <pid>
ändert die Priorität des Prozesses mit der PID <pid>.

gtar [-cxtvzbf] [<dateien>]
bearbeitet ein TAR-Archiv; Die wichtigsten Optionen:
-c Archiv erzeugen. Ein Bestehendes wird dabei überschrieben.
-x Archiv auspacken.
-t Archiv testen. In Verbindung mit »-v« kann der Inhalt des Archivs angezeigt werden.
-v Vorgang anzeigen.
-z »gtar« mit »compress« verbinden. Damit können gepackte Archive erzeugt und verwaltet werden.
-b n Blockgröße in n * 512 Byte festlegen.
-f name legt den Dateinamen für das Archiv fest.

top
Interaktives Programm zum Prozeßmanagement. Enthält »ps«, »renice« und »kill«.

zoo [axvH][PI//] <archiv> [<dateien>]P
archiviert die <dateien> in <archiv>.

a fügt Dateien hinzu bzw. erzeugt ein neues Archiv.
aP »packt« die Dateien zusätzlich.
x packt Dateien aus.
x// packt Dateien mit Ordnerstrukturen aus. Nicht vorhandene Ordner werden automatisch erzeugt.
v» zeigt den Archivinhalt an.
H gibt eine ausführliche Hilfe aus.
I sagt, daß die Dateinamen über Standardeingabe gelesen werden sollen.

Checkliste für Programmierer

Unsere Checkliste zeigt die Punkte auf, die Programme unter MiNT und MultiTOS zu beachten haben. Bestehende Programme sollten nicht um unzählige Features erweitert werden, bevor nicht Folgendes berücksichtigt wurde:

Für weitere Details empfehlen wir die MiNT-Dokumentation sowie das folgende Buch: Donald Lewine, »POSIX Programmer's Guide«, O'Reilly Associates, Inc., ISBN 0-937175-73-0. Dieses Buch ist z. Zt. nur in englischer Sprache erhältlich, beschreibt aber sehr ausführlich den Umgang mit den neuen Mechanismen unter C. Darüber hinaus enthält es einen umfangreichen Referenzteil, der die POSIX-Funktionen beschreibt. Es ist auch sehr hilfreich, wenn die MiNT-Library benutzt wird.


Oliver Scheel
Aus: ST-Magazin 05 / 1993, Seite 46

Links

Copyright-Bestimmungen: siehe Über diese Seite