MDXDave.de

IT-Freelancer // Android + Coding

Laden...

Betriebssysteme Praktikum - Aufgabe 2

veröffentlicht vor 8 Jahren, am 27. Mai 2015  |  Praktikum    Betriebssysteme      |  0 Kommentare

Nach dem ersten Praktikum des Betriebssysteme Praktikum, ist nun das zweite Praktikum dran.

Aufgabenblatt 2 findet ihr hier (nur mit ILIAS-Zugriff).

Aufgabe 1

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 Umgebungsvariable BSPRAKTIKUM 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.

Aufgabe 2

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.