Systempraktikum – Eignungsfeststellung (Gedächtnisprotokoll)
Reihenfolge war sicher anders, Aufgaben lagen in separaten Ordnern. Makefiles waren jeweils gegeben. Bei manchen Aufgaben mussten Headerfiles manuell hinzugefügt werden.
1. Verkettete Liste (vermutlich 4 Punkte)
Analog zu Aufgabe 3 von 2020, allerdings gab es zwei zu vervollständigende Funktionen:
- Eine Funktion, die ein Element vorne an die Liste anhängt.
- Eine Funktion, die ein Element hinten an die Liste anhängt.
2. Zombies vermeiden (2 Punkte)
Gegeben war eine Funktion in einer separaten Datei, in die Code eingetragen werden musste, der dazu führt, dass der aufrufende Prozess auf alle Kinder wartet. Es gab beide Punkte nur, wenn er auf alle Kinder wartet, nicht nur auf eines.
Tipp:
while ((wpid = wait(&status)) > 0)
(Dabei müssen wpid
und status
natürlich vorher deklariert werden.)
3. Struct schreiben (2 Punkte)
Gegeben war ein Struct namens composite
mit folgenden Attributen:
int x
float y
Es sollten zwei Methoden geschrieben werden (die Funktionsnamen waren anders):
-
Methode 1:
struct composite methodname(int a, float b);
Hier wird ein neues Struct erstellt und by value zurückgegeben.
-
Methode 2:
struct composite *methodname2(struct composite *a, struct composite *b);
Hier soll ein neues Struct erstellt werden, dessen
x
undy
jeweils die Summe der entsprechenden Attribute der beiden eingegebenen Structsa
undb
sind. Dabei muss das Struct dynamisch (z. B. mitmalloc
) erzeugt und by reference zurückgegeben werden.
4. Pipe erstellen und String in Großbuchstaben umwandeln (3 Punkte)
Eine ASCII-Tabelle wurde gegeben (ansonsten einfach “ASCII” verwenden). Siehe 2021, Aufgabe 4 (und weitere Gedächtnisprotokolle):
Es ist eine Funktion zu vervollständigen, die eine Pipe erstellt und einen String in Großbuchstaben hineinschreibt.
Die Umwandlung in Großbuchstaben erfolgt in der Funktion, beispielsweise:
creat_und_write(int *fd, char *string);
Die Datentypen konnten hierbei von denen im Protokoll von 2021 abweichen.
Tipps:
- Der eingegebene String ist immutable, Änderungen müssen also auf einer Kopie vorgenommen werden.
- Das Pipe-Beispiel aus der Anleitung sollte nicht
close(fd[0])
aufrufen, da diese Pipe auch vom Kindprozess genutzt wird, um lesen zu können.
5. Sockets (4 Punkte)
Aufgabenstellung analog zu den Klausuren von 2017 (und auch 2019).
Tipps:
- Unter der Manpage von
getaddrinfo()
findet sich ein Beispiel, das angepasst übernommen werden kann. - Der Port wird als
int
übergeben; mitsprintf
kann man diesen in einen String umwandeln.
Wichtig:
Das Beispiel aus der Manpage funktioniert zwar, aber das Klausursystem kannte weder getaddrinfo()
noch die zugehörigen Structs.
Lösungshinweis:
Vor allen Includes muss ein #define
eingefügt werden, gefolgt von einer Definition ähnlich wie _POSIX_C_SOURCE
mit einem entsprechenden Wert.
Was genau benötigt wird, steht in der Manpage von getaddrinfo()
(unter Feature Test Macro Requirements for glibc im Abschnitt SYNOPSIS). Dort wurden drei verschiedene Optionen aufgeführt – eine davon war korrekt. Ggf. sind auch zusätzliche Includes nötig. In diesem Fall sollte man die entsprechende Zeile in der Manpage beachten.
6. Commandline lesen (3 Punkte)
Es werden beliebig viele Parameter im Terminal eingelesen, der erste Parameter ist n
.
- Werden weniger als
n
Parameter übergeben, ist die Rückgabe1
. - Andernfalls soll der
n
-te übergebene Parameter in die Terminal-Ausgabe ausgegeben werden. - Im Fehlerfall ist das Ergebnis undefiniert (daher war vorgegeben:
return 0
).
7. Signalgandler bzw. Signal (2 Punkte)
Es sollte eine Methode vervollständigt werden, die eine pid
und ein signal
als Parameter nimmt. In der Methode soll das Signal an den gegebenen Prozess geschickt werden.
Tipp:
Der korrekte Aufruf lautet:
kill(pid, signal);
(Der ursprünglich hochgradig fehlerhafte Tipp-Text wurde hier entschlüsselt und korrigiert.)