Systempraktikum C - Klausur

Bearbeitungszeit: 120 Minuten

Hinweise:

  • Alle Aufgaben sind direkt in den dafür vorgesehenen Code-Abschnitten zu bearbeiten.
  • Achten Sie auf eine saubere Code-Struktur und kommentieren Sie Ihren Code ausreichend.
  • Nicht erlaubte Hilfsmittel: Internet, Kommunikation mit anderen Personen. Erlaubt sind Manpages.
  • Makefile und Header-Dateien sind, sofern nicht anders angegeben, bereits vorhanden und korrekt konfiguriert.
  • Es wird davon ausgegangen, dass alle notwendigen Header-Dateien eingebunden sind.
  • Fehlerbehandlung ist Teil der Aufgaben und wird bewertet.

Aufgabe 1: Verkettete Liste (4 Punkte)

Vervollständigen Sie die Funktionen add_front und add_back, um Elemente am Anfang bzw. Ende einer verketteten Liste hinzuzufügen.

struct node {
  int data;
  struct node *next;
};
 
void add_front(struct node **head, int data) {
  // Implementieren Sie hier
}
 
void add_back(struct node **head, int data) {
  // Implementieren Sie hier
}

Aufgabe 2: Zombie-Prozesse vermeiden (2 Punkte)

Implementieren Sie die Funktion wait_for_all_children, die sicherstellt, dass der aufrufende Prozess auf alle Kindprozesse wartet.

void wait_for_all_children() {
  // Implementieren Sie hier
}

Aufgabe 3: Strukturen (2 Punkte)

Gegeben ist die Struktur composite:

struct composite {
  int x;
  float y;
};

Implementieren Sie die Funktionen create_composite und add_composite:

struct composite create_composite(int a, float b) {
  // Implementieren Sie hier
}
 
struct composite* add_composite(struct composite *a, struct composite *b) {
  // Implementieren Sie hier
}

Aufgabe 4: Pipes und Großbuchstaben (3 Punkte)

Implementieren Sie die Funktion create_and_write, die eine Pipe erstellt und einen gegebenen String in Großbuchstaben umgewandelt in die Pipe schreibt. Die Funktion soll die Anzahl der geschriebenen Bytes zurückgeben.

int create_and_write(int fd[], const char *string) {
  // Implementieren Sie hier
}

Aufgabe 5: Sockets (4 Punkte)

Implementieren Sie die Funktion establish_connection, die eine Socket-Verbindung zu einem Server aufbaut. Die IP-Adresse und der Port des Servers werden als String bzw. Integer übergeben. Die Funktion soll den Socket-Deskriptor zurückgeben oder -1 im Fehlerfall. Verwenden Sie getaddrinfo().

#define _POSIX_C_SOURCE 200809L // oder ein anderer geeigneter Wert
 
int establish_connection(const char *ip_address, int port) {
  // Implementieren Sie hier
}

Aufgabe 6: Kommandozeilenargumente (3 Punkte)

Schreiben Sie ein Programm, das den n-ten Parameter aus den Kommandozeilenargumenten ausgibt. n ist dabei der erste Parameter. Gibt es weniger als n Parameter, soll das Programm 1 zurückgeben.

int main(int argc, char *argv[]) {
  // Implementieren Sie hier
  return 0;
}

Aufgabe 7: Signale senden (2 Punkte)

Implementieren Sie die Funktion send_signal, die ein gegebenes Signal an einen Prozess mit gegebener PID sendet.

void send_signal(pid_t pid, int signal) {
  // Implementieren Sie hier
}
×

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!