Systempraktikum C - Klausur
Zeit: 180 Minuten
Hilfsmittel: Manpages, ASCII-Tabelle
Hinweis: Alle Aufgaben sind in separaten Dateien zu bearbeiten. Makefiles und Header-Dateien sind vorhanden, sofern nicht anders angegeben. Achten Sie auf korrekte Speicherverwaltung und Fehlerbehandlung. Nicht initialisierter Speicher kann zu undefiniertem Verhalten führen.
Aufgabe 1: Erweiterte Verkettete Liste (6 Punkte)
Datei: linkedlist.c
Header: linkedlist.h
(vorhanden)
Erweitern Sie die Funktionalität der gegebenen verketteten Liste. Implementieren Sie folgende Funktionen:
void add_front(struct node **list, int x)
: Fügt ein Element mit dem Wertx
am Anfang der Liste ein. (2 Punkte)void add_back(struct node **list, int x)
: Fügt ein Element mit dem Wertx
am Ende der Liste ein. (2 Punkte)void remove_element(struct node **list, int x)
: Entfernt alle Elemente mit dem Wertx
aus der Liste. Geben Sie den Speicher der entfernten Elemente frei. (2 Punkte)
Aufgabe 2: Zombie Apocalypse Abwenden (3 Punkte)
Datei: zombies.c
Verhindern Sie Zombie-Prozesse. Die Funktion create_children(int num_children)
erzeugt num_children
Kindprozesse. Jeder Kindprozess führt eine einfache Berechnung aus und beendet sich. Implementieren Sie in wait_for_all_children()
die notwendige Logik, damit der Elternprozess auf alle Kindprozesse wartet und Zombie-Prozesse verhindert werden.
void wait_for_all_children(void);
Aufgabe 3: Dynamische Strukturen und Threads (5 Punkte)
Datei: composite_threads.c
Header: composite.h
(vorhanden)
Gegeben ist die Struktur composite
:
struct composite {
int x;
float y;
};
- Implementieren Sie
struct composite* create_composite(int a, float b)
, die eine neuecomposite
-Struktur dynamisch alloziert, initialisiert und einen Zeiger darauf zurückgibt. (2 Punkte) - Implementieren Sie
struct composite* add_composite(struct composite *a, struct composite *b)
, die eine neuecomposite
-Struktur dynamisch alloziert, derenx
undy
Werte die Summe der entsprechenden Werte vona
undb
sind, und einen Zeiger darauf zurückgibt. (1 Punkt) - Erstellen Sie zwei Threads. Jeder Thread soll eine
composite
-Struktur mit zufälligen Werten erstellen und diese an diemain
-Funktion zurückgeben. Diemain
-Funktion soll die beiden Strukturen addieren (mittelsadd_composite
) und das Ergebnis ausgeben. Verwenden Sie geeignete Mechanismen zur Synchronisation und Kommunikation zwischen den Threads. (2 Punkte)
Aufgabe 4: Pipe mit Großbuchstaben und Fehlerbehandlung (4 Punkte)
Datei: pipe_upper.c
Erweitern Sie die Funktion creat_und_write
:
int creat_und_write(int fd[], const char *string);
- Erstellen Sie eine Pipe. (1 Punkt)
- Erstellen Sie eine Kopie des übergebenen Strings und wandeln Sie diese in Großbuchstaben um. (1 Punkt)
- Schreiben Sie den umgewandelten String in die Pipe. (1 Punkt)
- Implementieren Sie umfassende Fehlerbehandlung für
pipe
undwrite
und geben Sie im Fehlerfall-1
zurück. Die Anzahl der geschriebenen Bytes soll im Erfolgsfall zurückgegeben werden. (1 Punkt)
Aufgabe 5: Robuster Socket-Client mit Timeout (6 Punkte)
Datei: socket_client.c
Implementieren Sie einen robusten Socket-Client, der eine Verbindung zu einem Server aufbaut.
- Verwenden Sie
getaddrinfo()
zum Auflösen der Serveradresse. Der Server-Hostname und -Port werden als String-Parameter übergeben. (2 Punkte) - Implementieren Sie ein Timeout von 5 Sekunden für den Verbindungsaufbau. (2 Punkte)
- Nach erfolgreichem Verbindungsaufbau soll der Client “Hello” an den Server senden und die Antwort des Servers (maximal 255 Zeichen) empfangen und ausgeben. Behandeln Sie alle möglichen Fehlerfälle. (2 Punkte)
Aufgabe 6: Kommandozeilenargumente und Primzahlprüfung (4 Punkte)
Datei: cmdline_prime.c
Schreiben Sie ein Programm, das Kommandozeilenargumente verarbeitet.
- Das Programm soll eine beliebige Anzahl an Integer-Argumenten akzeptieren. (1 Punkt)
- Prüfen Sie für jedes Argument, ob es sich um eine Primzahl handelt. (2 Punkte)
- Geben Sie für jedes Argument “prime” oder “not prime” auf der Konsole aus. (1 Punkt)
Aufgabe 7: Signal Handling und Interrupts (3 Punkte)
Datei: signal_handler.c
Schreiben Sie ein Programm, das einen Signal Handler für das Signal SIGINT
(Strg+C) installiert.
- Der Signal Handler soll die Anzahl der empfangenen
SIGINT
Signale zählen. (2 Punkte) - Beim dritten Empfang von
SIGINT
soll das Programm die Anzahl der empfangenen Signale ausgeben und sich beenden. (1 Punkt)
Dieses Dokument definiert die Klausuraufgaben. Viel Erfolg!