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; }