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 Wertxam Anfang der Liste ein. (2 Punkte)void add_back(struct node **list, int x): Fügt ein Element mit dem Wertxam Ende der Liste ein. (2 Punkte)void remove_element(struct node **list, int x): Entfernt alle Elemente mit dem Wertxaus 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, derenxundyWerte die Summe der entsprechenden Werte vonaundbsind, 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
pipeundwriteund geben Sie im Fehlerfall-1zurü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
SIGINTSignale zählen. (2 Punkte) - Beim dritten Empfang von
SIGINTsoll das Programm die Anzahl der empfangenen Signale ausgeben und sich beenden. (1 Punkt)
Dieses Dokument definiert die Klausuraufgaben. Viel Erfolg!