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:

  1. void add_front(struct node **list, int x): Fügt ein Element mit dem Wert x am Anfang der Liste ein. (2 Punkte)
  2. void add_back(struct node **list, int x): Fügt ein Element mit dem Wert x am Ende der Liste ein. (2 Punkte)
  3. void remove_element(struct node **list, int x): Entfernt alle Elemente mit dem Wert x 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;
};
  1. Implementieren Sie struct composite* create_composite(int a, float b), die eine neue composite-Struktur dynamisch alloziert, initialisiert und einen Zeiger darauf zurückgibt. (2 Punkte)
  2. Implementieren Sie struct composite* add_composite(struct composite *a, struct composite *b), die eine neue composite-Struktur dynamisch alloziert, deren x und y Werte die Summe der entsprechenden Werte von a und b sind, und einen Zeiger darauf zurückgibt. (1 Punkt)
  3. Erstellen Sie zwei Threads. Jeder Thread soll eine composite-Struktur mit zufälligen Werten erstellen und diese an die main-Funktion zurückgeben. Die main-Funktion soll die beiden Strukturen addieren (mittels add_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);
  1. Erstellen Sie eine Pipe. (1 Punkt)
  2. Erstellen Sie eine Kopie des übergebenen Strings und wandeln Sie diese in Großbuchstaben um. (1 Punkt)
  3. Schreiben Sie den umgewandelten String in die Pipe. (1 Punkt)
  4. Implementieren Sie umfassende Fehlerbehandlung für pipe und write 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.

  1. Verwenden Sie getaddrinfo() zum Auflösen der Serveradresse. Der Server-Hostname und -Port werden als String-Parameter übergeben. (2 Punkte)
  2. Implementieren Sie ein Timeout von 5 Sekunden für den Verbindungsaufbau. (2 Punkte)
  3. 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.

  1. Das Programm soll eine beliebige Anzahl an Integer-Argumenten akzeptieren. (1 Punkt)
  2. Prüfen Sie für jedes Argument, ob es sich um eine Primzahl handelt. (2 Punkte)
  3. 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.

  1. Der Signal Handler soll die Anzahl der empfangenen SIGINT Signale zählen. (2 Punkte)
  2. 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!

×

MyUniNotes is a free, non-profit project to make education accessible for everyone. If it has helped you, consider giving back! Even a small donation makes a difference.

These are my personal notes. While I strive for accuracy, I’m still a student myself. Thanks for being part of this journey!