Institut für Informatik Lehr- und Forschungseinheit für Kommunikationssysteme und Systemprogrammierung Systempraktikum - Wintersemester 2009/2010
Prof. Dr. Dieter Kranzlmüller |
Blatt 1- Grundlagen I: Funktionen, Kontrollstrukturen, E/A-Konzepte |
Abgabedatum theor. Aufgaben | Abgabedatum prakt. Aufgaben | Deadline Projektaufgaben |
---|---|---|
29.10. | 29.10. | - |
man gcc
) werden diese Parameter in verschiedene Kategorien eingeteilt, zu finden im Abschnitt ,,OPTIONS'', Unterabschnitt ,,Option Summary''. Erstellen Sie eine Liste dieser Kategorien. (Unterkategorien der Kategorie ,,Machine Dependent Options'' sollen nicht aufgelistet werden.) Geben Sie zu jeder gefundenen Kategorie an, für welche Arten von Aufgaben diese Kategorie passende Aufrufparameter anbietet. Suchen Sie sich aus jeder Kategorie einen beliebigen Aufrufparameter (Flag) aus, und beschreiben Sie kurz (in deutscher Sprache) seine Funktion.
-ansi
und/oder
-pedantic
aufrufen. Finden Sie heraus, wofür diese Zusatzoptionen jeweils stehen.
prog-1-3-d.c
für das Programm aus Aufgabe P-1-3, Teilaufgabe d.
all
enthält. Durch Aufruf von
make all
sollen alle Programme einer Aufgabe übersetzt werden. Bitte halten Sie sich unbedingt an diese Spezifikation, da einige Aufgaben automatisiert getestet werden.
main(...)
-Funktion enthalten.
main(...)
-Funktion, in der (beliebige) Aufrufe von Funktionen aus printfunctions.c vorkommen.
make p1
), nur Programm 2 (
make p2
) oder beide Programme (
make all
) zu übersetzen. Achten Sie vor allem darauf, die Abhängigkeiten für die verschiedenen Ziele korrekt zu definieren.
make all
) aufrufen?
make all
) aufrufen?
Parameter 1: param1
). Bauen Sie auch eine Fehlerbehandlung ein.
Überlegen Sie sich hierzu Lösungen für die folgenden Teilschritte:
abcdefghijklmnopqrstuvwxyz
. Fügen Sie außerdem am Ende einen Zeilenumbruch ein. Verwenden Sie die Funktion
printf()
.
fprintf()
. Tipp: Der Name für den Ausgabe-Strom der Konsole ist
stdout
.
*printf()
-Familie zu verwenden (gilt nur für diese Teilaufgabe). Benutzen Sie stattdessen die Funktion
putc()
in einer Schleife mit 26 Durchläufen. Tipp: Sehen Sie in einer ASCII-Tabelle nach, welchen Dezimalwert das Zeichen
'a'
hat. Auch der Zeilenumbruch soll auf diese Weise realisiert werden.
progname newfile.txt
. Verwenden Sie zum Anlegen der Datei die Systemfunktion
open()
. Sie liefert als Rückgabewert einen Filedeskriptor, den Sie beim Schreiben mittels
write()
benutzen können. Achten Sie jetzt auch auf eine sinnvolle Fehlerbehandlung, und prüfen Sie zu Beginn, ob tatsächlich ein Argument übergeben wurde. Falls nicht, lassen Sie eine entsprechende Meldung (auf der Konsole) ausgeben.
for
-, sondern eine
while
-Schleife, und zählen Sie die bereits geschriebenen Bytes ständig mit. Geben Sie am Ende auf der Konsole aus, wie viele Zeilen (also wie viele Aphabete) in die Datei geschrieben wurden.
progname newfile.txt 8388608
, um eine 8 MBytes große Datei zu erzeugen. Achtung: Begrenzen Sie die maximale Dateigröße auf einen sinnvollen Wert (z.B. 500 MBytes). Würde der übergebene Parameter diese Grenze überschreiten, soll das Programm mit einer Fehlermeldung beendet werden, ohne dass eine Datei erstellt und geschrieben wird.
progname sourcefile.txt destfile.txt
. Tipp: Um die Größe der Quelldatei zu ermitteln, inkludieren Sie bitte die Headerdatei
<sys/stat.h>
und verwenden im Programm den folgenden Code:
Listing 1: |
|
filesize
die Größe der Datei mit dem Dateinamen sourcefilename in Bytes.
putc()
beim Schreiben aus dem Puffer in die neue Datei (siehe Aufgabe P-1-3 c).
cat
unter Linux. Die Namen der auszugebenden Dateien erhält das Programm dabei als Aufrufparameter über die Kommandozeile. Verwenden Sie hierzu wieder die Bibliotheksfunktionen
open()
,
close()
,
read()
und
write()
(elementare E/A-Funktionen). Stellen Sie sicher, dass die Dateien mit
open()
nur zum Lesen geöffnet werden.
Testen Sie das Laufzeitverhalten ihres Programms mit verschiedenen Puffergrößen (1, 2, 4, 16, 64, 512, 4096, 131072 und dem Standardwert
BUFSIZ
), indem Sie eine große Datei (am besten mehrere Megabytes) ausgeben lassen. Verwenden Sie dazu den Befehl
time
und lenken Sie die Ausgabe nach
/dev/null
um (Aufruf:
time prog-1-4 datei > /dev/null
).
Bitte denken Sie an ein Makefile!