Übung
Systemprogrammierung 1 - Übung
- Die Klausurergebnisse wurden im campo und Waffel eingetragen. Der Klassenspiegel ist online einsehbar: SP, GSP Die erste Klausureinsicht findet am 26.7.24 um 10:00 Uhr in Raum 11302.02.133 (02.133-113 Übungsraum) statt. Eine zweite Klausureinsicht wird zu Beginn des Wintersemesters stattfinden.
- Fragestunde zur Klausur: Montag, 22.07.2024, 12:00 in H4
- Basierend auf Ihren Antworten bei der Rechnerübungs-Terminumfrage haben wir eine weiter Rechnerübung am Freitag um 16:00 (s.t.) eingerichtet. Diese findet erstmalig am 21.6. statt.
-
Der Übungsbetrieb beginnt mit den Donnerstagsgruppen am Donnerstag, 25.04.2024.
Hinweis: Teilnehmer der Mittwochsübungen sind dazu angehalten für die ersten beiden Übungswochen eine andere Übung zu besuchen.
- Beginn der Anmeldung zum Übungsbetrieb: Donnerstag, 18.04.2024, 16:00 via Waffel
Hinweis: Gruppenaufgaben können nur mit Partnern bearbeitet werden, die dieselbe 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.
Zur Information
- Linuxkurs der FSI-Informatik
Übungsfolien
All slides are copyrighted (C) 2011-2022 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!- Keine Materialien hinterlegt
- Keine Materialien hinterlegt
- Keine Materialien hinterlegt
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 ein Git-Repository 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. Die abgegebenen Aufgaben werden von uns korrigiert und bewertet. Die Ergebnisse der Korrektur sind nach Login im Waffel einsehbar.Aufgaben
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.
Nr. | Titel | Kurzbeschreibung | Ausgabe | Bearbeitungszeit (Werktage) |
Gruppen | Abzugebende Dateien | Zusatzinfos |
---|---|---|---|---|---|---|---|
1 | lilo | Dynamische Speicherallokierung | Donnerstag, 25.04.2024 | 6 | Nein | lilo.c | |
2 | wsort | Sortierprogramm ähnlich sort(1) | Donnerstag, 02.05.2024 | 7 | Ja | wsort.c | |
3 | clash | Kleine Shell mit Vorder- und Hintergrundprozessen | Montag, 13.05.2024 | 12 | Ja | clash.c, plist.c, Makefile | plist API |
4 | mach | Threads, Semaphore | Montag, 03.06.2024 | 10 | Nein | mach.c, queue.c, machfile | |
5 | halde | Einfache dynamische Freispeicherverwaltung | Montag, 17.06.2024 | 10 | Ja | halde.c, Makefile, test.c | |
6 | creeper | Verzeichnisse, Rekursion | Montag, 01.07.2024 | 7 | Ja | Makefile, creeper.c | argumentParser API |
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.
Termine
- Tafelübungen: Siehe Waffel-Link unter „Aktuelles“ (nach der ersten Vorlesung verfügbar).
- Rechnerübungen: Im Campo unter Menü (links oben) > Studienangebot > Veranstaltungen suchen > „Systemprogrammierung“ > Übungen / Rechnerübungen > Parallelgruppen / Termine.
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.
Gruppenabgaben: Für das Arbeiten in Gruppen beliebiger Größe wird Ihnen vom Abgabesystem automatisch ein zusätzlicher Bonuspunkt angerechnet.
Makefile
Fehlerbild | Anmerkung | Punktabzug |
---|---|---|
.PHONY fehlt oder unvollständig |
Ausnahme: erste Aufgabe mit Makefile, dort optional da noch nicht eingeführt | 0,5 |
all (oder Entsprechung) ist nicht erstes Target |
Ausnahme: erste Aufgabe mit Makefile, dort optional da noch nicht eingeführt | 0,5 |
Abhängigkeit(en) fehlen | pro Target | 0,5 |
Auf der Webseite geforderte Compilerflags fehlen | pro Compileraufruf | 0,5 |
CFLAGS oder CC werden nicht genutzt |
pro Variable; Ausnahme: erste Aufgabe mit Makefile, dort optional da noch nicht eingeführt | 0,5 |
Ü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.
Fehlerbild | Punktabzug |
---|---|
Auslösen eines Übersetzerfehlers | >= 3 |
Falsche oder unzureichende Fehlerbehandlung
Nutzung von C- und POSIX-Funktionen erfordern korrekte Fehlerbehandlung. Mögliche Fehler sind in derman
-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:
Nötige Fehlerbehandlung | Punktabzug |
---|---|
Prüfen auf Fehler | 0,5 |
falls errno zur Fehlerprüfung genutzt wird, obwohl laut Man-Page nicht vorgesehen |
0,5 |
Ausgabe des Fehlergrunds mit perror(3) (Funktion setzt errno ) oder fprintf(3) (sonst) (*); keine Fehlerausgabe bei selbst geschriebenen Bibliotheksfunktionen (z.B. der halde)! |
0,5 |
Behandlung des Fehlers: exit(3) oder return (**); kein exit bei selbst geschriebenen Bibliotheksfunktionen! |
0,5 |
Ausnahmen und Ergänzungen
malloc(3)
fehltstdout
strtol(3)
Nötige Fehlerbehandlung Punktabzug errno passend setzen sowie nach Aufruf prüfen 0,5 endptr prüfen (Eingabe nicht leer und wurde vollständig gelesen) 0,5 Ausgabe und Behandlung wie oben (*) und (**) 1 fgets(3)
Nötige Fehlerbehandlung Punktabzug Rückgabewert prüfen 0,5 Mit feof(3)
bzw.ferror(3)
auf Fehler prüfen0,5 Ausgabe und Behandlung wie oben (*) und (**) 1 fgetc(3)
Nötige Fehlerbehandlung Punktabzug Rückgabewerte EOF
und0xFF
können unterschieden werden1 Prüfen des Rückgabewerts auf EOF
0,5 Mit feof(3)
bzw.ferror(3)
auf Fehler prüfen0,5 Ausgabe und Behandlung wie oben (*) und (**) 1 sysconf(3)
Nötige Fehlerbehandlung Punktabzug Rückgabewert prüfen 0,5 Falls die angeforderte Information ein (Min-/Max-)Limit ist, passend errno
setzen und prüfen0,5 Ausgabe und Behandlung wie oben (*) und (**) 1 readdir(3)
Nötige Fehlerbehandlung Punktabzug Rückgabewert prüfen 0,5 errno
passend vor jedem Aufruf setzen sowie nach Aufruf im Fehlerfall prüfen0,5 Ausgabe und Behandlung wie oben (*) und (**) 1 getcwd(3)
Nötige Fehlerbehandlung Punktabzug Rückgabewert prüfen 0,5 errno
im Fehlerfall prüfen0,5 Falls errno
gleichERANGE
, ohne Abbruch Fehlergrund beseitigen und erneut aufrufen1 Ausgabe und Behandlung wie oben (*) und (**) 1 getaddrinfo(3)
Nötige Fehlerbehandlung Punktabzug Rückgabewert prüfen 0,5 Ausgabe des Fehlergrunds mit perror(3)
(bei Rückgabe vonEAI_SYSTEM
) odergai_strerror(3)
(sonst)1 Behandlung 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 beispielsweiseprintf(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.Verbotene Funktion | Alternative | Punktabzug |
---|---|---|
atoi(3) |
strtol(3) |
siehe oben bei strtol(3) |
Programmierfehler
Fehlerbild | Punktabzug |
---|---|
static fehlt |
0,5 |
Unnötige globale Variable | 0,5 |
free(3) fehlt |
1 |
close(2) oder fclose(3) fehlt |
1 |
printf(variable) , kein Format-String und variable vom Nutzer |
1 |
zu kleiner Puffer | 1 |
Verlust von benötigter Information durch Casten von Datentypen | 1 |
falsche Funktionsparameter | 0,5 |
errno wird vor perror(3) überschrieben (z.B. durch Funktionsaufruf) |
0,5 |
DoS durch getline() möglich |
2 |
sonstige Programmierfehler (Folgefehler nur für dieselben Programmierfehler) | 1 |
Programmierstil (Fehler)
Fehlerbild | Punktabzug |
---|---|
Unnötig (deutlich zu) große Puffer | 0,5 |
goto , falls offensichtlich unnötig oder um Schleifen nachzubauen (Sprung nach oben) |
1 |
Ausgabe in Bibliotdeksfunktionen (z.B. bei der halde) | 0,5 |
exit(3) in Bibliotdeksfunktionen (z.B. bei der halde); abort(3) ist erlaubt wenn es die Angabe vorsieht |
1 |
unnötiges Verwenden von Makros (pro Makro) | 0,5 |
offensichtlich schlechter Code (von Folgefehlern ausgenommen) | 1 |
Programmierstil (Hinweise)
Muster | Verbesserte Lösung |
---|---|
if (var) { free(var); } |
free(var); /* NOOP, iff var == NULL */ |
if (ptr == 0) { ... } |
if (ptr == NULL) { ... } |
(*ptr).member |
ptr->member |