Prof. Franz Schweiggert Abteilung Angewandte
Informationsverarbeitung 20. Juni 2006
Christian Ehrhardt Blatt 8
Systemnahe Software (SS 2006)
Abgabetermin 27.Juni 2006
Wir haben in der Vorlesung die nützliche Funktion popen
kennen gelernt. Allerdings hat diese Funktion einen Nachteil:
Es ist nicht möglich, sowohl an die Standardeingabe alsauch an
die Standardausgabe des ausgeführten Programms zu kommen.
Schreibt daher eine Funktion
int pexecvp(int *p, char * argv[]);
die das Programm argv[0] mit den Argumenten in
argv[] ausführt und in p[0] bzw. p[1]
ganz analog zum Systemcall pipe(2) zwei Filedeskriptoren
zurückliefert, die mit der Standardeingabe bzw. der Standardausgabe
des ausgeführten Programms verbunden sind. Der Rückgabewert
sollte im Erfolgsfall und im Fehlerfall sein. Im Fehlerfall
sollte errno einen sinnvollen Wert enthalten.
Testet diese Funktion mit einem kleinen Beispielprogramm.
Bei MasterMind geht es darum, einen Farbcode gegebener
Länge zu erraten. Wir werden die Farben mit Hilfe von Großbuchstaben
A,B,C... darstellen. Es ist bei Spielbeginn nur bekannt wieviele
verschiedenen Farben höchstens im Spiel sind und wie lange der
geheime Code ist. Nach jedem Rateversuch erhält der Spieler
ein Feedback bestehend aus zwei Zahlen black und
white. Die Zahl black gibt an, an wievielen
Positionen der Rateversuch mit dem geheimen Code übereinstimmt.
Ist diese Zahl gleich der Länge des Codes, dann ist das Spiel
gewonnen. Die Zahl white gibt an, um wieviel sich
black noch erhöhen läßt, wenn man die Reihenfolge
der Farben im aktuellen Rateversuch geeignet vertauscht. Wenn also
black+white der Länge des geheimen Codes entspricht, dann
ist klar, daß jede Farbe im geheimen Code genau so oft vorkommt
wie im aktuellen Rateversuch.
Ziel des Spiels ist es, den geheimen Code mit möglichst wenigen
Rateversuchen zu erraten.
Es gibt zwei Varianten dieses Spiels: Die UNIQUE-Variante
erlaubt nur ein einzelnes Vorkommen einer Farbe im Geheimcode,
die FREE-Variante erlaubt beliebig viele gleiche Farben.
Auf der Homepage zu den Übungen gibt es ein Programm
mm_server.c herunterzuladen, das von der Standardeingabe
Kommandos entgegen nimmt und die jeweiligen Antworten auf der
Standardausgabe ausgibt. Diese Kommandos erlauben es, gegen den
Server MasterMind zu spielen. Die Unterhaltung mit diesem MasterMind
Server spielt sich nach folgenden Regeln ab:
- Die Unterhaltung ist zeilenorientiert und jede Zeile
wird der Sequenz Carriage Return (r) gefolgt von
Newline (n) und nicht nur von einem Newline
beendet.
- Der Server beginnt die Kommunikation mit einer
Begrüßungszeile. Anschließend liest er zeilenweise
Kommandos von der Standardeingabe.
- Jede Zeile in der Eingabe besteht aus einem Kommando,
möglicherweise gefolgt von Parametern. Mögliche
Kommandos sind:
- GAME
- Dieses Kommando beginnt ein neues Spiel. Auf das Wort
GAME folgt entweder FREE oder UNIQUE, die Anzahl der
verwendbaren Farben und die Länge des zu erzeugenden
Codes. Alle Teile sind durch genau ein Leerzeichen
getrennt.
- GUESS
- Dieses Kommando führt einen Rateversuch aus. Auf das
Kommando folgt genau ein Leerzeichen und der Rateversuch
als String.
- RESET
- Dieses Kommando setzt die Kommunikation mit dem Server
zurück. Ein eventuell laufendes Spiel wird abgebrochen.
- SOLVE
- Dieses Kommando bricht ein laufendes Spiel ab und
verrät in der Antwort den geheimen Code.
- HELLO
- Dieses Kommando wird vom Server mit einer Zeile
beantwortet, die angibt, wieviele verschiedene Farben
vom Server maximal unterstützt werden und wie lange
ein vom Server erzeugter geheimer Code höchstens sein
kann.
- QUIT
- Dieses Kommando beendet die Kommunikation mit dem Server.
- Jedes Kommando (auch das Kommando QUIT) wird vom Server
mit einer einzelnen Zeile beantwortet. Die Zeile besteht aus
einer dreistelligen Zahl, einem Leerzeichen und einem Text,
der in menschenlesbarer Weise das Ergebnis des
Kommandos angibt. Die Bedeutung der dreistelligen Zahlen ist
wie folgt:
- Zahlen zwischen 200 und 299 signalisieren eine
erfolgreiche Ausführung des Kommandos.
- Zahlen zwischen 300 und 399 zeigen syntaktische
Fehler im Kommando oder in seinen Parametern an.
- Zahlen zwischen 400 und 499 zeigen Fehler in
der Abfolge der Kommandos an.
- Fehler zwischen 500 und 599 zeigen an, daß das
Kommando zwar syntaktisch korrekt aber aus anderen
Gründen fehlerhaft war.
Im einzelnen sind folgende Fehlernummern definiert. Ist
hinter einer Fehlernummer in der Beschreibung zusätzlicher
Text angegeben, dann enthält dieser Text zusätzliche
Informationen und der Text hat immer das angegebene Format.
Bei Fehlernummern ohne Text folgt auch stets eine Beschreibung,
deren Format ist aber nicht festgelegt.
- 200 MMSERVER colmax=%d lenmax=%d
- Dies ist die Begrüßungszeile des Servers und wird
nicht als Antwort auf ein Kommando erzeugt. Statt
%d steht an der entsprechenden Stelle natürlich
die Zahl der Farben und die maximale Länge des Codes,
die vom Server unterstützt werden.
- 201
- Dieser Fehlercode beantwortet ein erfolgreiches
GAME-Kommando.
- 202 MMSERVER colmax=%d lenmax=%d
- Die Antwort auf ein HELLO-Kommando im selben Format
wie die Begrüßungszeile.
- 203
- Die Antwort auf ein erfolgreiches RESET-Kommando.
- 204 Solution was %s
- Die Antwort auf ein erfolgreiches SOLVE-Kommando.
%s wird durch den geheimen Code ersetzt.
- 205
- Die Antwort auf ein GUESS-Kommando, das den geheimen
Code erraten hat. Damit ist das laufenden Spiel beendet.
- 206 Blacks=%d Whites=%d
- Die Antwort auf ein anderes GUESS-Kommando. Die
beiden %d werden durch die berechneten Werte für
black bzw. white ersetzt.
- 207
- Die Antwort auf ein erfolgreiches QUIT-Kommando.
- 301
- Ein GAME-Kommando enthielt weder FREE noch UNIQUE.
- 302
- Die Zahl der Farben oder die Länge des Codes bei
einem GUESS-Kommando war syntaktisch nicht korrekt.
- 303
- Ein Kommando enthielt zusätzliche Daten am Ende der
Zeile.
- 304
- Ein nicht näher spezifizierter Syntaxfehler im Kommando
oder seinen Parametern.
- 310
- Unbekanntes Kommando.
- 400
- Antwort auf ein GAME-Kommando während noch ein Spiel
läuft.
- 401
- Antwort auf ein SOLVE- oder GUESS-Kommando während gerade
kein Spiel läuft.
- 500
- Die Parameter eines GAME-Kommandos werden vom Server
nicht unterstützt.
- 501
- Bei einem GAME-Kommando wurde UNIQUE spezifiziert und
die Zahle der Farben ist kleiner als die Länge.
- 502
- Ein GUESS-Kommando enthielt einen Rateversuch mit
ungültigen Farben.
- 503
- UNIQUE ist spezifiziert und ein GUESS-Kommando enthält
eine oder mehrere Farben doppelt.
Der im vorherigen Abschnitt vorgestellt MasterMind Server eignet
sich hervorragend als Test für die Funktion pexecvp aus
dem ersten Teil. Schreibt also ein kleines Programm, das den
MasterMind-Server aufruft und mehrere Spiele mit verschiedenen
Parametern spielt. Dabei soll jeweils gezählt werden, wieviele
Rateversuche benötigt werden. Ausserdem ist grundsätzlich auf
eine sinnvolle Fehlerbehandlung zu achten.
- Wenn der MasterMind-Server von Hand getestet wird, muß
am Ende jeder Zeile ein r erzeugt werden. Das geht durch
die Tastenfolge Ctrl-V Ctrl-M.
- Es gibt keine Garantie, daß die Grenzen zwischen verschiedenen
Datenhäppchen über eine Pipe hinweg erhalten bleiben.
- Die Dateien mm_help.h und mm_help.c enthalten
Funktionen, die möglicherweise nützlich sein können.
- Eine einfache Ratestrategie ist es, mit einer Liste aller
möglichen geheimen Codes zu beginnen. Bei jedem Rateversuch
werden alle Einträge aus der Liste gestrichen, die nicht mit dem
Feedback dieses Rateversuchs zusammen passen. Der nächste
Rateversuch ist dann immer ein Eintrag aus der verbliebenen Liste.
Christian Ehrhardt
2006-06-20