Dr. M. Grabert Abteilung Angewandte Informationsverarbeitung 14. Mai 2001
Johannes Mayer Blatt 3


[c]



Systemnahe Software (SS 2001)


Abgabetermin: 21. Mai 2001

4 Umgebungsvariablen (3 Punkte)

Schreiben Sie ohne Verwendung der Bibliotheksfunktion char *getenv() ein C-Programm var.c, das zu einer als Parameter übergebenen Umgebungsvariable den passenden Wert zurückgibt, analog zu echo.


BEISPIEL:

thales$ echo $HOME
/home/thales/grabert
thales$ var HOME
/home/thales/grabert
thales$ var TTY
/dev/pts/35
thales$ var TTYRESET
2502:1805:bd:8a3b:3:1c:7f:15:4:0:0:0:11:13:1a:19:12:f:17:16:0:0:1
:1:0:00:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0:0
:0:0:0:0:0:0:0:0:0:0:0


Tipp: Über main(int argc, char **argv, char **env) bzw. extern char **environ kann auf die Umgebungsvariablen zugegriffen werden.

5 Once again, please: Tiny-Shell (7 Punkte)

Lösen Sie Aufgabe 1 von Blatt 1 nicht mehr mit system(), sondern mit Hilfe einer execXX()-Bibliotheksfunktion! Sie können sich eine passende Funktion der exec-Familie auswählen. Ihr Programm sollte in der Lage sein, Kommandos mit Positions-Parametern wie ,,ls var.c`` oder ,,ps -l -uswg`` auszuführen. Hintergrundkommandos (&) oder Dateiumlenkung (< > |) müssen nicht unterstützt werden. Der Sohnprozess sollte eine Fehlermeldung ausgeben, wenn er das angegebene Kommando nicht starten kann.


Tipp 1: Sparen Sie sich eine umständliche Prozessynchronisation. Der Vater wartet mit Hilfe von int wait(int *stat); auf den Sohn.
BEISPIEL:

void main()
{  int stat;

   switch (fork()) {
      case 0:
         puts("mir ist ploetzlich soo uebel ....");
         exit(1);
         break;
      default:
         wait(&stat);   /* wartet, bis Sohn gestorben ist! */
         puts("my son recently died ...");
   }
}

Tipp 2: Zerlegen Sie den Eingabestring der Shell mit Hilfe der Bibliotheksfunktion strtok() (siehe Manual), und bauen Sie dann mit den Ergebnissen den argv[]-Vektor für execXX() zusammen.
BEISPIEL:

void main()
{  char s[] = "Uihh: da sind aber viele Blanks drin!";
   char *hlp;
   extern char *strtok();

   hlp = strtok(s, " ");
   while (hlp) {
      puts(hlp);
      hlp = strtok((char*)0, " ");
   }
}


Viel Erfolg!


Johannes Mayer, 2001-05-14