Dr. Johannes Mayer Abteilung Angewandte
Informationsverarbeitung 6. Februar 2006
Axel Blumenstock Blatt 14
Christian Ehrhardt
Allgemeine Informatik III / Systemnahe Software I (WS 2005/2006)
Abgabetermin: 14. Februar 2006
Da Sie ja nun den gesamten Stoff dieser Vorlesung im Kopf haben,
sich andererseits Ihren verdienten Urlaub finanzieren müssen,
schreiben Sie nun noch ein kleines Programm, mit dem Sie u.a. Ihren
(hoch begehrten) Vorlesungsbegleiter versteigern
können.1
Dieses Programm (nennen wir es auction) soll von jedem
Auktionsteilnehmer aufgerufen werden und als einzigen Parameter den
Artikelnamen erhalten. Daraufhin gibt das Programm in
einer Schleife den aktuellen Gebotsstatus aus (mindestens den Betrag
und Zeitpunkt des Höchstgebots sowie den Namen des zugehörigen
Bieters) und erfragt vom Benutzer ein (weiteres) Gebot. Der
Benutzer kann dann wahlweise einen Betrag eingeben oder auch nur
ENTER drücken, um eine aktuelle Gebotsinformation zu
erhalten.
Die Gebotshistorie wird in einem Verzeichnis namens
/tmp/auction/Artikelname gehalten. Dieses
Verzeichnis soll angelegt werden, falls es noch nicht existiert.
Für jedes akzeptierte Gebot erzeugt das Programm darin eine leere
Datei, die nach der Gebotshöhe in Cent benannt ist. Der Name des
Bieters sowie der Gebotszeitpunkt sind damit automatisch als
Eigenschaften dieser Datei vermerkt. Nutzen Sie zum Anlegen dieser
Datei den Systemaufruf open(), und zwar so, dass er
fehlschlägt, wenn eine Datei gleichen Namens bereits existiert. Auf
diese Weise kann der bei einer Angebotskollision Unterlegene sofort
informiert werden. Ermitteln Sie den Gebotsstatus durch
Maximumbildung über die numerisch interpretierten Dateinamen.
Unter Berücksichtigung eines Ablaufzeitpunkts (Zusatzaufgabe)
könnten wir etwa folgenden spannenden Auktionsverlauf erleben:
$ whoami
miri
$ ./auction Vorlesungsbegleiter
Angebot Vorlesungsbegleiter endet in 60 Sekunden
es liegen noch keine Gebote vor.
Gebot (in Cent) eingeben oder <ENTER> fuer Aktualisierung: 5
Angebot Vorlesungsbegleiter endet in 51 Sekunden
derzeitiges Hoechstgebot (Miri Sübel um 10:25:39): 0.05 Euro
Gebot (in Cent) eingeben oder <ENTER> fuer Aktualisierung:
Angebot Vorlesungsbegleiter endet in 32 Sekunden
derzeitiges Hoechstgebot (Frank Reich um 10:25:55): 3.12 Euro
Gebot (in Cent) eingeben oder <ENTER> fuer Aktualisierung: 517
Gebot liegt nicht ueber aktuellem Hoechstgebot
Angebot Vorlesungsbegleiter endet in 12 Sekunden
derzeitiges Hoechstgebot (Resi Stenz um 10:26:16): 14.20 Euro
Gebot (in Cent) eingeben oder <ENTER> fuer Aktualisierung: 1567
Angebot Vorlesungsbegleiter
wurde ersteigert von Frank Reich fuer 19.99 Euro
$ ls -l /tmp/auction/Vorlesungsbegleiter
-rw---- 1 resi users 0 2006-02-14 10:26 1420
-rw---- 1 frank users 0 2006-02-14 10:26 1999
-rw---- 1 frank users 0 2006-02-14 10:25 312
-rw---- 1 miri users 0 2006-02-14 10:25 5
Sorgen Sie nun noch dafür, dass die Auktionen zu einem festen
Zeitpunkt nach Beginn (markiert durch das Anlegen des
Gebotsverzeichnisses) ablaufen. Die verbleibende Zeit soll nun
ebenfalls im Rahmen des Gebotsstatus ausgegeben werden. Nach Ablauf
sind keine weiteren Gebote mehr möglich, und das Programm wird mit
einer Meldung des Auktionsergebnisses beendet.
Für das Hinterlegen des Zeitpunkts des Auktionsbeginns suchen Sie
sich ein geeignetes Dateisystemobjekt aus ;-)
Machen Sie sich schließlich noch Gedanken, wie das System besser vor
Manipulation geschützt werden könnte. Die Auktionsteilnehmer
sollten keine Angebote löschen können (auch nicht die eigenen) und
auch keinen Einfluss auf den Endzeitpunkt der Auktion haben.
Sie können Ihr Programm beispielsweise mit folgenden Funktionen
strukturieren:
- char *createOfferDir(char *offerName)
- stellt sicher,
dass das Verzeichnis für den gegebenen Artikelnamen existiert.
Achten Sie darauf, dass die Anwender (etwa mit Punkten oder
Schrägstrichen im Artikelnamen) keinen Unfug anstellen können
;-)
- int getMaxBid(char *offerDir)
- ermittelt das Maximum
unter den numerisch interpretierten Dateinamen in
offerDir.
- int getOfferStatus(char *offerDir, int bid, struct
stat *statP)
- liefert Informationen zum Gebot der Höhe
bid.
- int printOfferStatus(char *offerDir, char
*offerName)
- gibt den Gebotsstatus auf der Standardausgabe aus.
- void placeBid(char *offerDir, int bid)
- überprüft, ob das Gebot bid das aktuelle Höchstgebot
überschreitet und legt ggf. eine entsprechende Datei im
Gebotsverzeichnis an. Eine perfekte Synchronisation ist an dieser
Stelle nicht erforderlich.
- void run(char *offerName)
- realisiert das zyklische
Ausgeben des Gebotsstatus und das Einlesen des nächsten Gebots.
Viel Erfolg!
Fußnoten
- ...
können.1
- Sollten Sie die Laufbahn zum Papst anstreben,
empfiehlt sich möglicherweise, noch ein paar Jahre mit der
Versteigerung zu warten.
Axel Blumenstock
2006-02-06