IT-Freelancer // Android + Coding
Nach dem ersten Praktikum des Betriebssysteme Praktikum, ist nun das zweite Praktikum dran.
Aufgabenblatt 2 findet ihr hier (nur mit ILIAS-Zugriff).
Auf die Fragen gehe ich erneut nicht ein, sondern nur auf die zwei Aufgabe am unteren Ende des Blattes und auf der zweiten Seite. Aufgabenstellung:
Schreiben Sie ein C-Programm, das die Inhalte der mittels doppelter Dereferenzierung unter**envp
gespeicherten Umgebungsvariablen darstellt.
Erzeugen Sie außerdem in Ihrem Programm die UmgebungsvariableBSPRAKTIKUM
mit einem beliebigen Wert. Geben Sie anschließend dem Nutzer eine Eingabemöglichkeit für den Namen einer Variablen, bei dem Sie prüfen ob er als Umgebungsvariable vorhanden ist und geben im Erfolgsfall den Inhalt aus, ansonsten eine Fehlermeldung.
Die meisten Sachen im Quellcode sind kommentiert, also sollte das Verständnis relativ leicht fallen (sofern ihr AP1/AP2/CGA einigermaßen verstanden habt ;)).
#include
int main(int argc, char *argv[], char *envp[])
{
// Prüfen ob der Parameter "list" übergeben wurde, dann Umgebungsvariablen anzeigen:
if(strcmp(argv[1], "list") == 0){
printf("Ausgabe der Umgebungsvariablen:\n");
// While-Schleife der Variablen
while(*envp)
printf("%s\n",*envp++);
} else {
// BSPRAKTIKUM-Variable auf den Wert der Variable USER setzen
setenv("BSPRAKTIKUM", getenv("USER"), 1);
printf("\nVariable BSPRAKTIKUM wurde gesetzt.\n\nBitte eine Variable eingeben, deren Inhalt angezeigt werden soll: ");
// data-Variable als char deklarieren
char data[64];
// fgets statt scanf
if (fgets(data, sizeof data, stdin)) {
// Zeilenumbruch entfernen
int len = strlen(data);
if( data[len-1] == '\n' )
data[len-1] = 0;
// Variable mit dem Namen in data auslesen
char* var = getenv(data);
if(strlen(var) < 1)
printf("Die Variable '%s' wurde nicht gefunden.", data);
else
printf("Der Inhalt der Variable '%s' lautet: %s", data, var);
}
}
}
Das Programm speichert ihr beispielsweise als app.c
und kompiliert es mittels gcc app.c -o app
.
Aufgabenstellung für Aufgabe 2:
Prozesserzeugung mit fork()
Sie haben folgendes C-Programm:
[...]
Wie erreiche ich durch Ergänzungen des obigen Programmes, dass jeder Kindprozess keine weiteren Kinder erzeugt?
Vorgegeben ist folgender Code:
#include
#include
int main(){
int i, pid, n = 3;
for(i=0; i < n; i++){
pid = fork();
if( pid == 0 ) {
printf("Kind %2d: PID: %d / PID von Parent: %d\n", i, getpid(), getppid());
}else
printf("Vater %2d: PID: %d / PID von Parent: %d\n", i, getpid(), getppid());
}
}
Damit die Kinderprozesse keine weiteren Kinderprozesse erzeugen, fügen wir einfach ein break;
oder exit(0);
in Zeile 9 ein:
[...]
if( pid == 0 ) {
printf("Kind %2d: PID: %d / PID von Parent: %d\n", i, getpid(), getppid());
break; // oder exit(0);
}else
[...]
Was ist nun der Unterschied zwischen break
und exit(0)
? exit(0)
beendet das Programm, break
hingegen nur die Schleife, je nachdem was das Programm eventuell nach der Prozesserzeugung ausführen sollte, kann entweder ein Beenden des Programms oder der Schleife sinnvoll sein.