SUCKUP.de

C-Programm – Umgebungsvariablen unter Linux

This blog post has been published on 2011-01-16 and may be out of date.

In dem Buch “Linux Programmierung” habe ich ein schönes Beispiel für Umgebungsvariablen unter Linux gefunden, welches ich gerade ein wenig Kommentiert habe… :-)

“Beachten Sie, dass sich die Umgebung nur lokal zum Programm verhält. Änderungen, die innerhalb des Programmes durchgeführt werden, werden nicht nach außen reflektiert, da Variablenwerte nicht vom untergeordneten Prozess (unser Programm) an den übergeordneten Prozess (die Shell) propagiert werden.” – Seite 166

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

/* argc -> Anzahl Kommandozeilenparameter + Programmnamen (1), somit ist der Wert min. 1 */
 
/* argv -> ist ein Zeiger auf das Feld (Array) mit der in argc angegebene Anzahl von Elementen...
	... und die Elemente (z.B.: argc[0] sind Zeiger auf eine Zeichenkette...
 
	arg[0] -> Programmname
	arg[1] -> 1. Parameter 
	arg[2] -> 2. Parameter
	[...]
	arg[n] -> letzter Parameter
	0L    -> das letzte Element von argv[] einthaelt eine Null
*/
int main(int argc, char *argv[]) {
	char *var, *value;

	// wenn kein oder mehr als 3 Parameter uebergeben wurden, dann ...
	if (argc == 1 || argc > 3) {
			// Fehlermeldung ausgeben und Programm beenden
			fprintf(stderr,"usage: environ var [value]\n");
			exit(1);
	}

	// 1. Parameter in die Variable "var" schreiben
	var = argv[1];
	// mit getenv den Wert der Umgebungsvariablen abrufen 
	// und in die Variable "value" schreiben
	value = getenv(var);
	// wenn value wahr bzw. vorhanden ist, dann ...
	if (value) {
			printf("Variable %s has value %s\n", var, value);
	// ... ansonsten ...
	} else {
			printf("Variable %s has no value\n", var);
	}

	// wenn 2. Parameter uebergeben wurden, dann ...
	if (argc == 3) {
		char *string;
		// 2. Parameter in die Variable "value" schreiben
		value = argv[2];
		// Speicherbereich fuer die Umgebungsvariablen + Wert anlegen
		string = malloc(strlen(var)+strlen(value)+2);
		// wenn string nicht wahr bzw. nicht vorhanden ist, dann ...
		if(!string) {
				// Fehlermeldung ausgeben und Programm beenden
				fprintf(stderr,"out of memory\n");
				exit(1);
		}
		// strcpy - Stringfunktion zum kopieren einer Zeichenkette (string <- var)
		strcpy(string,var);
		// strcat - Stringfunktion zum verketten von Strings (string=) 
		strcat(string,"=");
		// strcat - Stringfunktion zum verketten von Strings (string=value)
		strcat(string,value);
		printf("Calling putenv with: %s\n", string);
		//
		// putenv - Aendert oder setzt eine Umgebungsvariable, gibt -1 bei einem Fehler 
		// und 0 bei keinem Fehler aus 
		//
		// wenn nicht gleich 0 -> wenn ein Fehler aufgetreten ist , dann ...
		if (putenv(string) != 0) {
				// Fehlermeldung ausgeben, Speicher wieder freigeben und Programm beenden
				fprintf(stderr,"putenv failed\n");
				free(string);
				exit(1);
		}

		// den Wert der Umgebungsvariablen in der Variablen "var"
		// in die Variable "value" schreiben
		value = getenv(var);
		// wenn value gleich wahr bzw. gesetzt, dann ...
		if (value) {
				// Umgebungsvariablen + neuen Wert ausgeben
				printf("New value of %s is %s\n", var, value);
		// ... ansonsten ...
		} else {
				// Umgebungsvariablen + ? ausgeben
				printf("New value of %s is null??\n", var);
		}
	}
exit(0);
}