Übung
Übungen zu Systemprogrammierung 1 (für Wiederholer) im WS 2021/22
Zuletzt inhaltlich aktualisiert am 15. Oktober 2021
Allgemeines
Durch die aus medizinischen Gründen gebotene Einschränkung von Präsenzveranstaltungen wird der gesamte Übungsbetrieb durch ein virtuelles Angebot ersetzt. Dies umfasst sowohl die Tafel-, als auch Rechnerübungen. Um an diesem Übungsbetrieb teilnehmen zu können, müssen sich alle Teilnehmer auf folgenden Plattformen anmelden:
- Anmeldung im Waffel (Anmeldung ab 20.10 10:00)
- Anmeldung im StudOn
Da dieses Semester nur eine einzelne Tafelübung für Wiederholer angeboten werden kann wird sich mit allen Angemeldeten auf einen Termin geeinigt. Deshalb ist eine Anmeldung in Waffel notwendig, um an der Terminfindung beteiligt zu sein. Da die Kapazität stark begrenzt ist darf sich nur anmelden, wer nicht SP2 hört. Doppelanmeldungen werden ohne Benachrichtigung gelöscht.
Die klassische Tafelübung wird durch eine Reihe von Lehrvideos ergänzt, die den Inhalt der Übung aufbereiten. Die Videos zielen darauf ab, das notwendige Wissen zur Bearbeitung der Übungsaufgaben zu vermitteln. In der Präsenztafelübung werden Inhalte der Videos vertieft und Fragen beantwortet. Ergänzend dazu können im StudOn-Forum Fragen zum Inhalt gestellt werden.
Im Rahmen der Tafelübung wird in der Woche nach Abgabe einer Aufgabe, diese mit dem Tutor nachbereitet. Neben der Vorstellung und Besprechung einer Abgabe wird dabei auch auf individuelle Probleme eingegangen. In GSP wird die Tafelübung zunächst nur online veranstaltet.
Hinweis: Gruppenaufgaben können nur mit Partnern bearbeitet werden, die die selbe Tafelübung besuchen.
Hinweis: Zu Beginn der Tafelübungen können ein oder auch mehrere Teilnehmer zur Vorstellung ihrer gelösten Übungsaufgabe aufgefordert werden. Nichtanwesenheit oder nicht hinreichende Erklärung der Aufgabe führt hierbei zur Bewertung der Aufgabe mit 0 Punkten.
In den Rechnerübungen sind die Arbeitsplätze des Rechnerraums für SP-Studenten reserviert. In diesen Übungen sollen die Aufgaben bearbeitet werden, wobei in der Regel ein Betreuer zur Verfügung stehen wird um bei Bedarf Hilfestellung zu geben.
Bestimmte Termine der Rechnerübung werden nicht über die CIP-Räume betreut, sondern finden virtuell statt. Um an der virtuellen Rechnerübung teilzunehmen muss nach der Anmeldung im Waffel-Kurs das SVN-Passwort gesetzt worden sein. Anschließend kann an der virtuellen Aufrufanlage eine Wartemarke zur Beratung gezogen werden. Dies ist nur zu den festgelegten Rechnerübungsterminen möglich. Details zur Funktionsweise werden in der ersten (ggf. virtuellen) Tafelübung besprochen.
Zur Information
- UNIX-Einführung der FSI-Informatik
Folien der Tafelübung
All slides are copyrighted (C) 2011-2021 by Wolfgang Schröder-Preikschat and Jürgen Kleinöder, University of Erlangen-Nürnberg, Germany. Use without prior written permission of the authors is not permitted!
Übung 1: Dynamische Speicherverwaltung
Aufgabe: lilo
Übungswoche: 25.10.2021 - 29.10.2021
Besprechung: 15.11.2021 - 19.11.2021
Folien: PDF
Videos:
Übung 2: Fehlerbehandlung, generisches Sortieren
Übungswoche: 08.11.2021 - 12.11.2021
Videos:
Übung 3: Zeigerarithmetik, Untypisierter und typisierter Speicher, make(1)
Übungswoche: 22.11.2021 - 26.11.2021
[Folien als PDF]()
Videos:
- [Freispeicherverwaltung]()
- [Implementierung]()
- [make]()
- [gdb]()
- [halde + Beispiel]()
Besprechung Aufgabe 2 (wsort)
Übungswoche: 29.11.2021 - 03.12.2021
Übung 4: Speicherlayout, UNIX-Prozesse
Übungswoche: 06.12.2021 - 10.12.2021
[Folien als PDF]()
Videos:
- [Adressraumstruktur]()
- [Prozesse]()
- [Stringmanipulation mit strtok(3)]()
- [make]()
- [clash + Beispiel]()
Besprechung Aufgabe 3 (halde)
Übungswoche: 13.12.2021 - 17.12.2021
Übung 5: POSIX-Threads, Koordinierung mit Semaphoren
Übungswoche: 20.12.2021 - 23.12.2021
[Folien als PDF]()
Videos:
- [Threads]()
- [Koordinierung]()
- [mach + Beispiel]()
Besprechung Aufgabe 4 (clash)
Übungswoche: 10.01.2022 - 14.01.2022
Übung 6: Dateisystem, Dateiattribute, Dateisystem-API
Übungswoche: 17.01.2022 - 21.01.2022
[Folien als PDF]()
Videos:
- [Dateisystemaufbau]()
- [Dateisystemschnittstelle]()
- [Wildcards]()
- [Beispiel]()
Besprechung Aufgabe 5 (mach) + Klausurvorbereitung
Übungswoche: 24.01.2022 - 28.01.2022
Besprechung Aufgabe 6 (creeper) + Klausurvorbereitung
Übungswoche: 07.02.2022 - 11.02.2022
Anfertigung, Abgabe und Bewertung der Übungsaufgaben
Soweit in der Aufgabenstellung nicht abweichend beschrieben, sollen alle abgegebenen Programme portabel zur SUSv4/POSIX.1-2008-Systemschnittstelle sein und im Sprachumfang dem C-Standard ISO C11 entsprechen. Alle Programme müssen mit folgenden Compileroptionen übersetzen:
Die Abgabe erfolgt über die Rechnern im CIP-Pool mit dem Skript /proj/i4sp1/bin/submit und muss vor dem Abgabetermin erfolgen. Dies kann über das Internet geschehen, sodass die Anwesenheit im CIP-Raum nicht notwendig ist. Eine Abgabe per E-Mail oder USB-Stick ist grundsätzlich nicht möglich.
Zur Bearbeitung der Aufgaben wird Ihnen automatisch ein Projektverzeichnis angelegt, nachdem Sie sich zu einer Übung angemeldet haben. Der Pfad zu diesem Verzeichnis lautet /proj/i4sp1/LOGIN, wobei LOGIN für Ihren Benutzernamen im CIP-Pool steht. Bitte bearbeiten Sie Ihre Aufgaben in diesem Verzeichnis und verwalten Sie das Verzeichnis wie in der ersten Aufgabenstellung beschrieben, da ansonsten das Abgabesystem Ihre Lösung nicht finden kann.
Die abgegebenen Aufgaben werden von uns korrigiert und bewertet. Die Ergebnisse der Korrektur sind nach Login im Waffel einsehbar und können zusätzlich über das SVN abgerufen werden.
Übungsaufgaben
Die Übungsaufgaben für das komplette Semester stehen grob fest. Allerdings können sich bis zum Ausgabezeitpunkt noch Details an den Aufgaben ändern.
Die verlinkten Aufgabenstellungen mit einem „Entwurf“-Wasserzeichen im Hintergrund stellen lediglich eine Orientierungshilfe dar. Die endgültigen Aufgabenstellungen werden spätestens am Ausgabetag verlinkt.
Auch die Hinweise zur Aufgabe auf dem Aufgabenblatt können Teile der einzuhaltenden Spezifikation enthalten und sind somit explizit als Teil der Aufgabenstellung zu verstehen.
Alle Aufgaben werden den Korrekturhinweisen entsprechend bewertet.
1. lilo
- lilo: Dynamische Speicherallokierung
- Bearbeitungszeit: 6 Tage
- Alleine (keine Zweiergruppen)
- Abzugebende Dateien: lilo.c
2. wsort
- wsort: Sortierprogramm ähnlich sort(1)
- Bearbeitungszeit: 9 Tage
- Zweiergruppe
- Abzugebende Dateien: wsort.c
3. halde
- halde: Einfache dynamische Freispeicherverwaltung
- Bearbeitungszeit: 12 Tage
- Zweiergruppe
- Abzugebende Dateien: halde.c, Makefile, test.c
4. clash
- clash: Kleine Shell mit Vorder- und Hintergrundprozessen
- Bearbeitungszeit: 10 Tage
- Zweiergruppe
- Abzugebende Dateien: clash.c, plist.c, Makefile
- Zusatzinfos: TODO Doxygen
5. mach
- mach: Threads, Semaphore
- Bearbeitungszeit: 11 Tage
- Alleine (keine Zweiergruppen)
- Abzugebende Dateien: mach.c, queue.c, machfile
6. creeper
- creeper: Verzeichnisse, Rekursion
- Bearbeitungszeit: 9 Tage
- Zweiergruppe
- Abzugebende Dateien: Makefile, creeper.c
- Zusatzinfos: TODO Doxygen
Literaturempfehlungen
Einführung in die Programmiersprache C
- Stephen Kochan: Programming in C. Sams Publishing, 3rd Edition, 2005.
- Karlheinz Zeiner: Programmieren lernen mit C. Carl Hanser, 4. Auflage, 2000.
- Steve Oualline: Practical C Programming. O’Reilly, 1991.
- Peter Darnell, Philip Margolis: C: A Software Engineering Approach. Springer, 1991.
- Brian Kernighan, Dennis Ritchie: The C Programming Language. Prentice Hall, 1988 (in der deutschen Übersetzung 1990 bei Hanser erschienen)
UNIX-Systemprogrammierung
- A. S. Tanenbaum, A. S. Woodhull: Operating Systems: Design And Implementation, Prentice Hall, 1997.
- R. W. Stevens: Advanced Programming in the UNIX Environment. Addison-Wesley, 1992.
Übersicht aller angebotenen Tafel- und Rechnerübungen
Tafelübungen
Rechnerübungen
Rechnerübungen zu Systemprogrammierung 1 und 2
Dozent/in
Details
Zeit/Ort n.V.
- Di 10:15-11:45, Raum 01.155-113 CIP (außer vac) (Kurs R02 (Kilian Bender, Felix Hanika))
- Di 14:15-15:45, Raum 01.155-113 CIP (außer vac) (Kurs R03 (Julian Preis, Johannes Weidner))
- Mi 16:15-17:45, Raum 01.155-113 CIP (außer vac) (Kurs R05 (Christian Halder, Philip Kaludercic))
- Mi 14:15-15:45, Raum 01.155-113 CIP (außer vac) (Kurs R04 (Ferdinand Schober, Felix Windsheimer))
- Do 10:15-11:45, Raum 01.155-113 CIP (außer vac) (Kurs R06 (Luca Preibsch, David Sauerwein))
- Mo 14:15-15:45, Raum 01.155-113 CIP (außer vac) (Kurs R01 (Christian Halder, David Sauerwein))
- Fr 14:15-15:45, Raum 01.155-113 CIP (außer vac) (Kurs R07 (Ferdinand Schober, Johannes Weidner))
- Do 14:15-15:45, Raum 01.155-113 CIP (außer vac) (Kurs R08 (unbetreut))
Korrekturhinweise
Die in den Aufgaben beschriebenen Anforderungen müssen durch das Programm erfüllt sein, damit Bonuspunkte gesammelt werden können. Dazu gehört auch, dass alle angeforderten Ressourcen beim erfolgreichen Beenden des Programms wieder freigegeben werden; im Fehlerfall müssen keine Ressourcen freigegeben werden. Für jeden Fehler in der Implementierung werden Punkte von der maximal erreichbaren Punktzahl abgezogen.
Jede Datei (C-Datei oder Makefile) gilt als eigenes Modul. Punkte werden in dem Modul abgezogen, wo laut Aufgabenstellung die Funktionalität zu erwarten ist. Jedes Modul wird mit mindestens Null Punkten bewertet. Die maximalen Punkte pro Modul stehen in der Aufgabenstellung.
Die folgenden Korrekturrichtlinien zeigen wofür und in welchem Ausmaß Punkte bei Fehlern abgezogen werden. Sie sind als Richtlinien zu verstehen und nicht vollständig. In Ausnahmen kann davon abgewichen werden. Falls nicht weiter spezifiziert wird für jedes Auftreten eines Fehlers die genannten Punkte abgezogen, auch mehrfach für denselben Fehler an unterschiedlichen Stellen im Programm. Tritt derselbe Fehler mehr als zweimal auf, so gibt es ab dem dritten Auftreten keinen Punktabzug mehr und er wird als Folgefehler gewertet.
Eine gekürzte Variante der Korrekturhinweise steht als Cheatsheet zum Drucken zur Verfügung.
Makefile
.PHONY
fehlt oder unvollständigall
(oder Entsprechung) ist nicht erstes TargetCFLAGS
oder CC
werden nicht genutzt, obwohl in der Aufgabenstellung gefordertÜbersetzerfehler
Wenn sich ein Programm nicht übersetzen lässt werden vom jeweiligen Modul Punkte abgezogen. Für jeden Auslöser von Übersetzerfehlern werden Punkte abgezogen. Dies betrifft auch vom Übersetzer ausgelöste Warnungen, da mit -Werror
kompiliert wird.
Falsche oder unzureichende Fehlerbehandlung
Nutzung von C- und POSIX-Funktionen erfordern korrekte Fehlerbehandlung. Mögliche Fehler sind in der man
-Page der betreffenden Funktion nachzulesen. Alle Funktionen benötigen Fehlerbehandlung, außer die Funktion kann nicht fehlschlagen. Ob eine Funktion fehlschlagen kann, richtet sich nach der POSIX Spezifikation (man 3p funktion
). Für jede falsche oder nicht ausreichende Fehlerbehandlung werden Punkte abgezogen. Typische Bestandteile einer Fehlerbehandlung sind:
errno
zur Fehlerprüfung genutzt wird, obwohl laut Man-Page nicht vorgesehenperror(3)
(Funktion setzt errno
) oder fprintf(3)
(sonst) (*); keine Fehlerausgabe bei selbst geschriebenen Bibliotheksfunktionen (z.B. der halde)!exit(3)
oder return
(**); kein exit
bei selbst geschriebenen Bibliotheksfunktionen!Insgesamt wird für eine normale Fehlerbehandlung (Ausnahmen siehe unten) maximal 1 Punkt abgezogen, dies gilt auch wenn die Fehlerbehandlung komplett fehlt.
Falls die Fehlerbehandlung das Programm beendet, müssen keine Ressourcen (angeforderter Speicher, offene Dateien, etc.) freigegeben werden.
Ausnahmen und Ergänzungen
malloc(3)
fehltstdout
Manche Funktionen benötigen aufwändigere Fehlerbehandlung, bei der das Prüfen auf einen Fehler komplizierter ist. Somit kann mehr als ein Punkt abgezogen werden. Der maximale Punktabzug pro Funktion ergibt sich aus der Summe der hier aufgezählten möglichen Fehler. Dieser wird auch verwendet, wenn die Fehlerbehandlung komplett fehlt.
strtol(3)
Nötige FehlerbehandlungPunktabzugerrno passend setzen sowie nach Aufruf prüfen0,5endptr prüfen (Eingabe nicht leer und wurde vollständig gelesen)0,5Ausgabe und Behandlung wie oben (*) und (**)1fgets(3)
Nötige FehlerbehandlungPunktabzugRückgabewert prüfen0,5Mitfeof(3)
bzw.ferror(3)
auf Fehler prüfen0,5Ausgabe und Behandlung wie oben (*) und (**)1fgetc(3)
Nötige FehlerbehandlungPunktabzugRückgabewerteEOF
und0xFF
können unterschieden werden1Prüfen des Rückgabewerts aufEOF
0,5Mitfeof(3)
bzw.ferror(3)
auf Fehler prüfen0,5Ausgabe und Behandlung wie oben (*) und (**)1sysconf(3)
Nötige FehlerbehandlungPunktabzugRückgabewert prüfen0,5Falls die angeforderte Information ein (Min-/Max-)Limit ist, passenderrno
setzen und prüfen0,5Ausgabe und Behandlung wie oben (*) und (**)1readdir(3)
Nötige FehlerbehandlungPunktabzugRückgabewert prüfen0,5errno
passend vor jedem Aufruf setzen sowie nach Aufruf im Fehlerfall prüfen0,5Ausgabe und Behandlung wie oben (*) und (**)1getcwd(3)
Nötige FehlerbehandlungPunktabzugRückgabewert prüfen0,5errno
im Fehlerfall prüfen0,5Fallserrno
gleichERANGE
, ohne Abbruch Fehlergrund beseitigen und erneut aufrufen1Ausgabe und Behandlung wie oben (*) und (**)1getaddrinfo(3)
Nötige FehlerbehandlungPunktabzugRückgabewert prüfen0,5Ausgabe des Fehlergrunds mitperror(3)
(bei Rückgabe vonEAI_SYSTEM
) odergai_strerror(3)
(sonst)1Behandlung bei Fehler wie oben (**)0,5
Fehlerbehandlung bei Ein-/Ausgabe
Ein-/Ausgabe benötigt Fehlerbehandlung um beispielsweise Fehler beim Schreiben auf eine volle Festplatte zu erkennen und damit Datenverlust zu verhindern. Fehlerbehandlung ist für alle Funktionen nötig, die Ein-/Ausgabe durchführen die zur Grundfunktionalität des Programms gehören (geht aus der Aufgabe hervor). Das beinhaltet beispielsweise printf(3)
, fclose(3)
oder close(2)
. Ausgenommen davon sind dabei die Fehlermeldungen selbst sowie unwichtige Ausgaben. Falls sich das Programm bei einem Schreibfehler sowieso mit einem Fehlercode beenden würde (bspw. SIGPIPE
) so ist keine Fehlerbehandlung nötig.
Damit auch Schreibfehler auf stdout
erkannt werden (wichtig falls in eine Datei umgeleitet wird), muss vor Beendigung des Programms stdout
mit fflush(3)
geflushed werden. Dies ist nur nötig, falls das Programm Ausgaben auf stdout
nutzt.
Verbotene Funktionen
Folgende Funktionen ermöglichen keine korrekte Fehlerbehandlung und dürfen nicht verwendet werden. Als Punktabzug ergibt sich jeweils der maximale Punktabzug der korrekten Alternative.
atoi(3)
strtol(3)
strtol(3)
Programmierfehler
static
fehltfree(3)
fehltclose(2)
oder fclose(3)
fehltprintf(variable)
, kein Format-String und variable
vom Nutzererrno
wird vor perror(3)
überschrieben (z.B. durch Funktionsaufruf)Programmierstil (Fehler)
goto
, falls offensichtlich unnötig oder um Schleifen nachzubauen (Sprung nach oben)exit(3)
in Bibliotheksfunktionen (z.B. bei der halde); abort(3)
ist erlaubt wenn es die Angabe vorsiehtProgrammierstil (Hinweise)
if (var) { free(var); }
free(var);
if (ptr == 0) { ... }
if (ptr == NULL) { ... }
(*ptr).member
ptr->member