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.
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!