Systempraktikum C - Klausur

Bearbeitungszeit: 120 Minuten

Hilfsmittel: Keine

Hinweise:

  • Alle Aufgaben sind direkt im bereitgestellten Code-Editor zu bearbeiten.
  • Achten Sie auf eine klare Code-Struktur und kommentieren Sie Ihren Code ausreichend.
  • Nicht kompilierbarer Code führt zu Punktabzug.
  • Die Verwendung von externen Bibliotheken (außer den angegebenen) ist nicht erlaubt.

Aufgabe 1: Interprozesskommunikation mit Pipes (40 Punkte)

Implementieren Sie ein Programm, das zwei Kindprozesse erzeugt. Der Elternprozess sendet eine Zeichenkette an den ersten Kindprozess. Dieser Kindprozess wandelt die Zeichenkette in Großbuchstaben um und sendet sie an den zweiten Kindprozess. Der zweite Kindprozess gibt die empfangene Zeichenkette auf der Konsole aus.

Vorgegebener Code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <ctype.h>
 
// Funktion zum Konvertieren in Großbuchstaben
void to_upper(char *str) {
    // Implementieren Sie hier die Konvertierung
}
 
int main() {
    int pipe1[2], pipe2[2];
    pid_t pid1, pid2;
    char message[] = "Hallo Welt!";
 
    // Erstellen Sie die Pipes
 
    // Erzeugen Sie den ersten Kindprozess
 
    if (pid1 == 0) {
        // Kindprozess 1: Empfängt Nachricht, konvertiert in Großbuchstaben und sendet an Kindprozess 2
 
    } else {
        // Erzeugen Sie den zweiten Kindprozess
 
        if (pid2 == 0) {
            // Kindprozess 2: Empfängt Nachricht und gibt sie aus
 
        } else {
            // Elternprozess: Sendet Nachricht an Kindprozess 1
 
        }
    }
 
    return EXIT_SUCCESS;
}

Aufgabe 2: Shared Memory (30 Punkte)

Schreiben Sie ein Programm, das einen Shared Memory Bereich erstellt und eine Integer-Variable darin speichert. Ein Kindprozess soll den Wert dieser Variable auslesen, um 5 erhöhen und wieder zurückschreiben. Der Elternprozess soll anschließend den neuen Wert aus dem Shared Memory auslesen und auf der Konsole ausgeben.

Vorgegebener Code:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/shm.h>
#include <sys/types.h>
 
int main() {
    int shmid;
    int *shared_var;
    pid_t pid;
 
    // Erstellen Sie den Shared Memory Bereich
 
    // Erzeugen Sie den Kindprozess
 
    if (pid == 0) {
        // Kindprozess: Wert auslesen, erhöhen und zurückschreiben
 
    } else {
        // Elternprozess: Warten auf Kindprozess, Wert auslesen und ausgeben
 
    }
 
    // Shared Memory freigeben
 
    return EXIT_SUCCESS;
}

Aufgabe 3: Client-Server Kommunikation (30 Punkte)

Implementieren Sie einen Client, der eine Verbindung zu einem Server aufbaut (IP-Adresse: 127.0.0.1, Port: 12345). Der Client sendet die Zeichenkette “Klausur bestanden!” an den Server. Sie müssen die Server-Seite nicht implementieren. Konzentrieren Sie sich auf die Client-seitige Implementierung der Verbindungsaufnahme und des Sendens der Nachricht.

Vorgegebener Code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/socket.h>
#include <arpa/inet.h>
 
int main() {
    int sock;
    struct sockaddr_in server;
    char message[] = "Klausur bestanden!";
 
    // Erstellen Sie den Socket
 
    // Konfigurieren Sie die Serveradresse
 
    // Stellen Sie die Verbindung zum Server her
 
    // Senden Sie die Nachricht
 
    // Schließen Sie den Socket
 
    return EXIT_SUCCESS;
}

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!