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
}