Allgemeines
Der Übungsbetrieb umfasst Tafel- und Rechnerübungen.
Jeder Student sollte eine Tafelübung besuchen, zu der eine
Anmeldung via waffel erforderlich ist.
Die Rechnerübungstermine können ohne vorherige Anmeldung je nach Bedarf besucht werden.
Die Tafelübungen dienen der Vermittlung von Theoriewissen, welches zur Lösung der Übungsaufgaben erforderlich ist.
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.
Zur Information
Folien der Tafelübungennach oben ▲
All slides are copyrighted (C) 2011-2025 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!
Kurzbeschreibung | Übungswoche | PDF |
U1 | Netzwerkkommunikation, Sockets, POSIX-I/O vs. C-I/O, Aufgabe 1 | 29.04 – 03.05.2019 | pdf, (A5), (A6) |
U2 | Netzwerkkommunikation, UNIX-Signale, Aufgabe 2 | 13.05 – 17.05.2019 | pdf, (A5), (A6) |
B1 | Besprechung Aufgabe 1 | 20.05 – 24.05.2019 | |
U3 | UNIX-Signale, Nebenläufigkeit, Duplizieren von Dateideskriptoren, Aufgabe 3 | 27.05 – 31.05.2019 | pdf, (A5), (A6) |
B2 | Besprechung Aufgabe 2 | 03.06 – 07.06.2019 | |
U4 | Thread-Synchronisation, Bibliotheken, Aufgabe 4 | 17.06 – 21.06.2019 | pdf, (A5), (A6) |
B3 | Besprechung Aufgabe 3 | 24.06 – 28.06.2019 | |
U5 | Ringpuffer, Semaphore, Zusammenfassung, Aufgabe 5 | 01.07 – 05.07.2019 | pdf, (A5), (A6) |
B4 | Besprechung Aufgabe 4, Klausurvorbereitung | 08.07 – 12.07.2019 | pdf, (A5), (A6) |
UK | Klausurvorbereitung | 15.07 – 19.07.2019 | Klausur, Man-Pages |
B5 | Besprechung von Aufgabe 5, Evaluierung, Klausurvorbereitung | 22.07 – 26.07.2019 | |
Anfertigung, Abgabe und Bewertung der Übungsaufgabennach oben ▲
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:
-std=c11
-pedantic
-Wall
-Werror
-D_XOPEN_SOURCE=700
Die Abgabe erfolgt an den Rechnern im CIP-Pool mit dem Skript
/proj/i4sp2/bin/submit und muss vor dem Abgabetermin erfolgen. 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/i4sp2/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 ausgedruckt und korrigiert. Die
korrigierten Ausdrucke werden in den Tafelübungen ausgehändigt. Die
Ergebnisse der Korrektur sind außerdem nach Login im
Waffel einsehbar.
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.
Nr. |
Titel |
Kurzbeschreibung |
Ausgabe |
Bearbeitungszeit (Werktage) |
2er-Gruppen |
Abzugebende Dateien |
Zusatzinfos |
1 |
snail
|
Socket-Kommunikation (Client) |
Montag, 29.04.2019 |
10 |
Nein |
snail.c, Makefile
|
|
2 |
sister
|
Socket-Kommunikation (Server), Signale, Makefile |
Montag, 13.05.2019 |
11 |
Ja |
sister.c, connection-fork.c, request-http.c, Makefile
|
API-Dokumentation
|
3 |
rush
|
POSIX-Signale, Filedeskriptoren, Nebenläufigkeit |
Montag, 27.05.2019 |
11 |
Ja |
Makefile, rush.c
|
API-Dokumentation
|
4 |
jbuffer
|
Semaphore, nicht-blockierende Synchronisation, Bibliotheken |
Montag, 17.06.2019 |
11 |
Nein |
jbuffer.c, sem.c, Makefile
|
API-Dokumentation
|
5 |
mother
|
Socket-Kommunikation (Server), POSIX-Threads, Verzeichnisse, Prozesse, Signale |
Montag, 01.07.2019 |
11 |
Ja |
connection-mt.c, request-httpx.c
|
API-Dokumentation
|
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übungennach oben ▲
Übersicht aller angebotenen Rechnerübungennach oben ▲
| Mo | Di | Mi | Do | Fr |
08:00 | | | | | | |
|
|
|
09:00 | | | | | | |
|
|
|
10:00 | | | | | | |
| | | |
|
|
11:00 | | | |
|
|
| | | |
12:00 | | | | | | |
| | | | | |
|
|
13:00 | |
|
|
| | | | | |
14:00 | | | | | | |
| | | | | |
|
|
15:00 | |
|
|
| | | | | |
16:00 | | | | | | |
| | | |
|
|
17:00 | | | |
|
|
| | | |
Rechnerübungen zu Systemprogrammierung 1 und 2 (RÜ SP)
- Verantwortliche
- Simon Ruderich, M. Sc., Dustin Nguyen, M. Sc., Christian Eichler, M. Sc., Dr.-Ing. Jürgen Kleinöder
- Angaben
- Übung
2 SWS, Sprache Deutsch
- Studienfächer / Studienrichtungen
- WPF MT-MA-BDV ab 1
WPF M-BA 2
WPF TM-BA 2
PF CE-BA-G 2-3
PF INF-BA 2-3
PF INF-LAG ab 5
PF IuK-BA 2-3
PF WINF-BA 2-3
PF MT-BA-BV 4
Kurse
| | Mo | 10:15 - 11:45 | 01.155-113 | Kurs R01 (Zahn, Johannes; Knauer, Lou) |
| | Simon Ruderich Dustin Nguyen Christian Eichler
| | |
| | Mo | 12:15 - 13:45 | 01.155-113 | Kurs R02 (Windsheimer, Felix) |
| | Simon Ruderich Dustin Nguyen Christian Eichler
| | |
| | Mo | 14:15 - 15:45 | 01.155-113 | Kurs R03 (Ottman, Jenny) |
| | Simon Ruderich Dustin Nguyen Christian Eichler
| | |
| | Mo | 16:15 - 17:45 | 01.155-113 | Kurs R04 (Bender, Kilian; Bergmann, Paul) |
| | Simon Ruderich Dustin Nguyen Christian Eichler
| | |
| | | | Simon Ruderich Dustin Nguyen Christian Eichler
| | |
| | Di | 12:15 - 13:45 | 01.155-113 | Kurs R06 (Baecker, Ruben; Perst, Timur) |
| | Simon Ruderich Dustin Nguyen Christian Eichler
| | |
| | Di | 14:15 - 15:45 | 01.155-113 | Kurs R07 (Gsänger, Helene; Hanika, Felix) |
| | Simon Ruderich Dustin Nguyen Christian Eichler
| | |
| | Di | 16:15 - 17:45 | 01.155-113 | Kurs R08 (Stephan, Milan; Weidner, Johannes) |
| | Simon Ruderich Dustin Nguyen Christian Eichler
| | |
| | Mi | 12:15 - 13:45 | 01.155-113 | Kurs R09 (Dengler, Eva; Güthlein, Florian) |
| | Simon Ruderich Dustin Nguyen Christian Eichler
| | |
| | Mi | 14:15 - 15:45 | 01.155-113 | Kurs R10 (Bläse, Fabian; Nguyen, Dustin) |
| | Simon Ruderich Dustin Nguyen Christian Eichler
| | |
| | Mi | 16:15 - 17:45 | 01.155-113 | Kurs R11 (Schleier, Tobias; Friedrich, Kay) |
| | Simon Ruderich Dustin Nguyen Christian Eichler
| | |
| | Do | 10:15 - 11:45 | 01.155-113 | Kurs R12 (Brander, Julian) |
| | Simon Ruderich Dustin Nguyen Christian Eichler
| | |
| | Do | 12:15 - 13:45 | 01.155-113 | Kurs R13 (Schreiner, Jonas) |
| | Simon Ruderich Dustin Nguyen Christian Eichler
| | |
| | Do | 14:15 - 15:45 | 01.155-113 | Kurs R14 (Braun, Lukas; Schoeninger, Stefan) |
| | Simon Ruderich Dustin Nguyen Christian Eichler
| | |
| | Fr | 12:15 - 13:45 | 01.155-113 | Kurs R16 (Preis, Julian; Ruderich, Simon) |
| | Simon Ruderich Dustin Nguyen Christian Eichler
| | |
| | | | Simon Ruderich Dustin Nguyen Christian Eichler
| | |
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 Beenden des Programms wieder
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.
Eine gekürzte Variante der Korrekturhinweise steht als
Cheatsheet
zum Drucken zur Verfügung.
Makefile
Fehlerbild |
Punktabzug |
Anmerkung |
.PHONY fehlt oder unvollständig |
0,5 |
Ausnahme: halde, dort optional da noch nicht eingeführt |
all (oder Entsprechung) ist nicht erstes Target |
0,5 |
Ausnahme: halde, dort optional da noch nicht eingeführt |
Abhängigkeit(en) fehlen |
0,5 |
pro Target |
Auf der Webseite geforderte Compilerflags fehlen |
0,5 |
pro Compileraufruf |
CFLAGS oder CC werden nicht genutzt, obwohl in der Aufgabenstellung gefordert |
0,5 |
pro Variable |
Ü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öser eines Übersetzerfehlers |
3 |
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.
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 |
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
Fehlerbild |
Punktabzug |
Anmerkung |
Fehlerbehandlung zu malloc(3) fehlt |
0,5 |
pro Abgabe maximal -3 |
Fehlerausgabe auf stdout |
0,5 |
einmalig pro Abgabe |
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 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üfen |
0,5 |
Ausgabe und Behandlung wie oben (*) und (**) |
1 |
-
fgetc(3)
:
Nötige Fehlerbehandlung |
Punktabzug |
Rückgabewerte EOF und 0xFF können unterschieden werden |
1 |
Prüfen des Rückgabewerts auf EOF |
0,5 |
Mit feof(3) bzw. ferror(3) auf Fehler prüfen |
0,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üfen |
0,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üfen |
0,5 |
Ausgabe und Behandlung wie oben (*) und (**) |
1 |
-
getcwd(3)
:
Nötige Fehlerbehandlung |
Punktabzug |
Rückgabewert prüfen |
0,5 |
errno im Fehlerfall prüfen |
0,5 |
Falls errno gleich ERANGE , ohne Abbruch Fehlergrund beseitigen und erneut aufrufen |
1 |
Ausgabe und Behandlung bei Fehler 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 von EAI_SYSTEM ) oder gai_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 beispielsweise
printf(3)
, fclose(3)
oder close(2)
.
Ausgenommen davon sind dabei die Fehlermeldungen selbst sowie unwichtige
Ausgaben.
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 |
Anmerkung |
static fehlt |
0,5 |
pro Abgabe maximal -2 |
Unnötige globale Variable |
0,5 |
pro Abgabe maximal -1 |
free(3) fehlt |
1 |
pro Abgabe maximal -3 |
close(2) oder fclose(3) fehlt |
1 |
pro Abgabe maximal -3 |
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 |
pro Funktionsaufruf maximal -1 |
errno wird vor perror(3) überschrieben (z.B. durch Funktionsaufruf) |
0,5 |
pro Abgabe maximal -2 |
sonstige 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 Bibliotheksfunktionen (z.B. bei der halde) |
0,5 |
exit(3) in Bibliotheksfunktionen (z.B. bei der halde); abort(3) ist erlaubt wenn es die Angabe vorsieht |
1 |
offensichtlich schlechter Code |
1 |
Programmierstil (Hinweise)
Fehlerbild |
Verbesserte Lösung |
if (var) { free(var); } |
free(var); |
if (ptr == 0) { ... } |
if (ptr == NULL) { ... } |
(*ptr).member |
ptr->member |