Systempraktikum C - Klausur (Variante 1)

Bearbeitungszeit: 120 Minuten

Hinweise:

  • Alle Aufgaben sind direkt in der gegebenen Datei zu bearbeiten.
  • Stellen Sie sicher, dass Ihr Code kompiliert und die erwartete Ausgabe erzeugt.
  • Nicht benötigter Code kann gelöscht werden.
  • Kommentieren Sie Ihren Code ausreichend.
  • Achten Sie auf eine saubere Formatierung.

Aufgabe 1: Verkettete Liste (4 Punkte)

Vervollständigen Sie die Funktionen add_front und add_back zum Einfügen von Elementen in eine verkettete Liste.

#include <stdio.h>
#include <stdlib.h>
 
struct node {
  int x;
  struct node *next;
};
 
void add_front(struct node **list, int x) {
  // Implementieren Sie hier
}
 
void add_back(struct node **list, int x) {
  // Implementieren Sie hier
}
 
int main() {
  struct node *list = NULL;
  add_front(&list, 5);
  add_back(&list, 10);
  add_front(&list, 2);
 
  struct node *current = list;
  while (current != NULL) {
    printf("%d ", current->x);
    current = current->next;
  }
  printf("\n"); // Erwartete Ausgabe: 2 5 10
 
  // Speicher freigeben (nicht Teil der Aufgabe, aber gute Praxis)
  while (list != NULL) {
    struct node *temp = list;
    list = list->next;
    free(temp);
  }
  return 0;
}

Aufgabe 2: Zombies vermeiden (2 Punkte)

Vervollständigen Sie die Funktion wait_for_all_children, um alle Kindprozesse zu beenden und Zombie-Prozesse zu vermeiden.

#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
 
void wait_for_all_children() {
  // Implementieren Sie hier
}
 
int main() {
    pid_t pid = fork();
 
    if (pid == 0) {
        // Kindprozess
        printf("Kindprozess beendet\n");
        return 0;
    } else if (pid > 0) {
        // Elternprozess
        wait_for_all_children();
        printf("Elternprozess beendet\n");
    } else {
        perror("fork fehlgeschlagen");
        return 1;
    }
    return 0;
}

Aufgabe 3: Struct erstellen (2 Punkte)

Vervollständigen Sie die Funktionen create_composite und add_composite zum Erstellen und Addieren von composite Structs.

#include <stdio.h>
#include <stdlib.h>
 
struct composite {
  int x;
  float y;
};
 
struct composite create_composite(int a, float b) {
  // Implementieren Sie hier
  struct composite temp;
  return temp;
}
 
struct composite* add_composite(struct composite *a, struct composite *b) {
  // Implementieren Sie hier
  return NULL;
}
 
int main() {
  struct composite c1 = create_composite(5, 2.5);
  struct composite c2 = create_composite(2, 1.5);
  struct composite *c3 = add_composite(&c1, &c2);
 
  if (c3 != NULL) {
    printf("x: %d, y: %f\n", c3->x, c3->y); // Erwartete Ausgabe: x: 7, y: 4.0
    free(c3);
  }
  return 0;
}

Aufgabe 4: Signal senden (2 Punkte)

Vervollständigen Sie die Funktion send_signal, um ein Signal an einen Prozess zu senden.

#include <signal.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>
 
void send_signal(pid_t pid, int signal) {
  // Implementieren Sie hier
}
 
int main() {
  pid_t pid = fork();
 
  if (pid == 0) {
    // Kindprozess (Hier würde normalerweise ein Signal Handler implementiert)
    printf("Kindprozess wartet auf Signal…\n");
    pause(); // Wartet auf ein Signal
    printf("Kindprozess hat Signal empfangen.\n");
    return 0;
  } else if (pid > 0) {
    // Elternprozess
    printf("Elternprozess sendet Signal…\n");
    send_signal(pid, SIGUSR1);
    printf("Elternprozess beendet.\n");
  } else {
    perror("fork fehlgeschlagen");
    return 1;
  }
 
  return 0;
}
 

Aufgabe 5: Kommandozeilenargumente (3 Punkte)

Schreiben Sie ein Programm, das den n-ten Parameter aus den Kommandozeilenargumenten ausgibt. Der erste Parameter gibt an, welcher Parameter (n) ausgegeben werden soll.

#include <stdio.h>
#include <stdlib.h>
 
int main(int argc, char *argv[]) {
  // Implementieren Sie hier
  return 0;
}

Diese Klausur konzentriert sich auf die grundlegenden Konzepte aus dem gegebenen Material. Es werden keine komplexen Socket- oder Pipe-Operationen mit Stringmanipulation abgefragt. Die Aufgaben sind so gestaltet, dass sie die Kernkompetenzen im Umgang mit verketteten Listen, Prozessen, Signalen, Structs und Kommandozeilenargumenten prüfen. Der Schwierigkeitsgrad ist an die gegebenen Beispiele angelehnt und entspricht dem Niveau einer Einführungsklausur.

×

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!