14.2 Environmentvariablen

Unter allen gängigen Betriebssystemen gehört zu einem laufenden Prozeß ein sogenanntes environment; das ist nichts weiter als eine Sammlung von Variablen (Umgebungsvariablen, Environmentvariablen).

Jede dieser Variablen besteht aus einem Namen und einem Wert, wobei es keine verschiedenen Datentypen gibt. Vielmehr ist der Wert jeder vorhandenen Variable nur eine Zeichenkette.

Wenn auf einem konkreten System Environmentvariablen existieren, dann hat man damit neben den Programmargumenten eine weitere Möglichkeit, Informationen an ein Programm zu übergeben.

Das ist sinnvoll für Informationen, die sich nicht ständig ändern und hautpsächlich für mehrere Prozesse gelten, wie beispielsweise der Name des aktuellen Benutzers (USER), Suchpfade für zu startende Programme (PATH), Homeverzeichnis des Benutzers (HOME), bevorzugter Drucker (PRINTER), und ähnliches. Anstatt solche Informationen bei jedem Programmstart angeben zu müssen, definiert man entsprechende Environmentvariablen. Diese bleiben während der gesamten Arbeitssitzung erhalten (sofern sie nicht explizit geändert werden) und stehen damit allen Programmen gleichermaßen zur Verfügung.

Jedes Programm kann die Variablen auswerten, oder sie ignorieren. In der Regel erben neu gestartete Programme alle Environmentvariablen ihres Aufrufers, ohne daß dazu besondere Vorkehrungen nötig wären.

Um in einem laufenden Programm das Environment abfragen zu können, bekommt unter den meisten Systemen die Funktion main() einen dritten Parameter. Dieser ist ein Zeiger auf ein Feld von nullterminierten Strings (ähnlich wie der zweite Parameter auf die Programmargumente zeigt), also vom Typ char ** beziehungsweise char *[]. Jeder dieser Strings enthält den Namen einer Variablen, dann ein Gleichheitszeichen (=), gefolgt vom Wert der Variable. Ein Beispiel für einen solchen String könnte ¨HOME=/home/klaus¨ sein; darin wird die Variable HOME mit dem Wert ¨/home/klaus¨ definiert.

Die Anzahl der vorhandenen Variablen wird nicht übergeben (anders als bei den Programmargumenten); stattdessen ist hinter der letzten Variable im Feld von char*-Zeigern eine NULL abgelegt, daran muß man beim Abfragen das Ende erkennen.

Dieser Mechanismus ist nicht im ANSI-Standard enthalten, aber sehr weit verbreitet (alle unixähnlichen Systeme, unter Windows zumindest wenn man mit gcc, Visual C++, Borland oder Visual Age arbeitet)

Das folgende Programm zeigt, wie man in main() an die Parameter kommt:

/* Time-stamp: "03.10.02 08:19 pamainenv.c klaus@wachtler.de"
 *
 * (Ausgabe aller envirnoment-Variablen; kein ANSI-Standard!)
 */

int main( int n, char **s, char **env_pp )
{
  /* Schleife über alle Environmentvariablen
   * (nach der letzten ist noch ein NULL-Zeiger im
   * Feld, woran man das Ende erkennen kann):
   */
  while( *env_pp )
  {
    /* *env_pp ist noch nicht NULL, also ausgeben:
     */
    puts( *env_pp );

    env_pp++;  /* Zeiger auf die nächste Env.-Var. setzen */
  }

  return 0;
}

Die (gekürzte) Ausgabe könnte so aussehen:

PWD=/home/klaus/skript_c
MAKEFLAGS=
WINDOWID=8388622
PAGER=less
...

Hinweis: Mit getenv() gibt es einen portablen Weg, den Wert einer Environmentvariablen zu erfahren, falls man ihren Namen kennt (dies ist überall im möglich, nicht nur in main()).

Eine portable Möglichkeit, alle Environmentvariablen zu erfragen, ohne vorher ihre Namen zu kennen, existiert nicht.

AnyWare@Wachtler.de