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!