Universität Ulm -Sektion Angewandte Informationsverarbeitung 8.Übungsblatt (29.06.99 bis 6.07.99) zur Vorlesung Systemnahe Software II (SS 99)




Aufgabe 1 (10 Punkte)

Hinweis:

Für den Übungsschein in Systemnahe Software II sind bekanntlich 50 % der Punkte aus den Übungsblättern und 50 % aus der Klausur bzw. Nachklausur zu erreichen. Gezählt werden bei den Übungen die Blätter 1 bis 5 und 7, wobei hier 45 Punkte den 50 % entsprechen. Dieses 8. Übungsblatt muß nicht zwingend bearbeitet werden, gibt den Knapp-unter-Fünfzigern aber noch eine letzte Chance, die magische Zahl zu erreichen.
Es gibt kein Ferienübungsblatt!

In diesem Übungsblatt soll die Funktion setenv() zum Setzen einer Umgebungsvariable bzw. zum Ändern des aktuellen Wertes einer Variable ohne Verwendung von putenv(3C) implementiert werden. Die folgende Abbildung zeigt das typische Speicher-Layout eines C-Programms etwas genauer:

Wie in der Abbildung zu sehen ist, befindet sich das Environment am Ende des Prozeß-Adreßraumes (hier: high address) und kann deshalb nicht nach "oben" vergrößert werden. Ebenso kann das Environment nicht nach unten ausgedehnt werden, da sich der Stack nicht verschieben läßt. Wird nun mit setenv() eine neue Variable gesetzt oder der Wert einer bestehenden Variable so verändert, daß die String-Länge des neuen Wertes größer als die des alten Wertes ist, so kann der zusätzlich benötigte Speicherplatz nur im heap-Segment des Adreßraumes bereitgestellt werden (siehe malloc(3C), brk(2)) -- Warum?

Versuchen Sie in Ihrer Implementierung mit möglichst wenig dynamisch allokiertem Speicher auszukommen und verwenden Sie folgende Schnittstelle:


   int setenv(char *name, char *value)   /* 0 if OK, != 0 on error */

Testen Sie Ihre Funktion, indem Sie in einem Testprogramm (mit Argumentverarbeitung) das folgende kleine Programm mit exec(2) ausführen:


   #include <stdio.h>
   int main(void)
   {
      extern char **environ; char **envp;

      for(envp = environ; envp && *envp; envp++)
         (void) puts(*envp);
      return 0;
   }