Das Verhalten
eines Programmes lässt sich über seine Umgebung beeinflussen.
Dieser Artikel erklärt die dafür notwendigen
Werkzeuge.
Die Umgebung eines Programmes besteht aus einem Satz von Umgebungsvariablen, die alle in der Form NAME=wert vorliegen. Der bekannteste Vertreter dieser Gattung ist sicher die Umgebungsvariable PATH, welche bestimmt, in welchen Verzeichnissen nach ausführbaren Programmkomponenten gesucht wird. Andere Umgebungsvariablen informieren über Arbeitsverzeichnis, Benutzername oder Betriebssystem des Computers. Von letzterem hängt es auch ab, welche Umgebungsvariablen eigentlich genau vorhanden sind.
Einem C-Programm wird die Liste aller gesetzten Umgebungsvariablen
über den (weitgehend unbekannten) dritten Parameter der
main Funktion mitgeteilt. Das folgende
Beispielprogramm showenv gibt alle
Umgebungsvariablen aus:
#include <stdlib.h> #include <stdio.h> int main(int argc, char **argv, char **env) { char **entry; for (entry = env; *entry != NULL; ++entry) { printf("%s\n", *entry); } return 0; }
Der Anwender darf eigene Umgebungsvariablen definieren. Diese
können (abhängig vom Betriebssystem) am Kommandoprompt gesetzt
werden. Unter Windows lautet das dafür notwendige Kommando zum
Beispiel:
set variable=name
Mit einer solchen selbstdefinierten Umgebungsvariablen lassen sich
einem Programm systemabhängige Parameter mitteilen, zum Beispiel
der Name eines Verzeichnissen mit Anwendungsdaten. Den
Verzeichnisnamen fest in den Programmcode einzubauen wäre
schlechter Stil - schließlich hängt dieser von der konkreten
Laufzeitumgebung ab, welche zur Entwicklungszeit noch nicht bekannt
ist.
Der Wert einer bestimmten Umgebungsvariablen kann mittels der Funktion getenv abgefragt werden. Das Beispiel dokumentiert dies anhand der Auswertung der Umgebungsvariablen USER beziehungsweise USERNAME:
#include <stdlib.h> #include <stdio.h> int main() { char *user; user = getenv("USER"); // Unix if (NULL == user) { user = getenv("USERNAME"); // Windows } if (NULL != user) { printf("Hallo %s!\n", user); } else { printf("Wer bist denn Du?\n"); } return 0; }
Natürlich ist es auch möglich, Umgebungsvariablen im Programm zu verändern oder zu setzen. Allerdings gelten diese nur für das Programm selbst und vom Programm gestartete Kindprozesse! Eine Veränderung der aufrufenden Umgebung ist generell nicht möglich. Somit lässt sich auch die Umgebung des aufrufenden Kommandointerpreters nicht verändern, nach Beendigung des Programmes hat dieser die gleiche Umgebung wie vorher.
Das abschließende Beispiel zeigt, wie mittels putenv die PATH Variable eines Kindprozesses manipuliert werden kann. Zur Demonstration des veränderten Pfades wird das Programm showenv aus dem ersten Beispiel per execlp ausgeführt:
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <process.h> int main() { char path[128]; /* set up new path */ strcpy(path, "PATH=."); putenv(path); /* start new program to display the new path */ execlp("showenv", "showenv", NULL); return 1; }