• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[gelöst] Umgebungsvariablen auslesen / verändern in C

Phillinger

Member
Hi,

ich möchte zur Laufzeit meines C-Programms eine Umgebungsvariable auslesen und diese auch von der Kommandozeile aus verändern können. Beispielprogramm:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{
	char chEnv[4] = "";
	
	while((strcmp(chEnv, "kill")) != 0)
	{
		// erase former content of string
		sprintf(chEnv,"\0");

		sprintf(chEnv,"%s",getenv("VERBOSE"));
		printf("Verbose-Level: %s\n", chEnv);
		
		sleep(3);
	}
	return 0;
}

Auf der Konsole tippe nun
Code:
export VERBOSE="1"
./meinProgramm &
und schon gibt er mir brav alle 3 Sekunden "Verbose-Level: 1" aus. Wenn ich nun aber auf der Konsole VERBOSE mit einem erneuten export VERBOSE="2" verändere, so ist ihm das egal, für ihn gilt VERBOSE zum Zeitpunkt des Programmstarts, bzw. die Kopie davon.

Wie kann ich es erreichen, daß mein Programm die aktuelle Umgebungsvariable ausliest?
 
OP
Phillinger

Phillinger

Member
Das Programm soll nicht neu gestartet werden. Es läuft im Hintergrund und liest alle drei Sekunden mit getenv() die Umgebungsvariable "VERBOSE" aus. (siehe Listing)

Wenn ich nun also auf der Konsole, auf der ich das Programm gestartet habe ("./meinProgramm &"), mit export die Umgebungsvariable VERBOSE ändere, kümmert sich das Programm nicht drum. Aber genau das will ich!
 
A

Anonymous

Gast
Phillinger schrieb:
Das Programm soll nicht neu gestartet werden. Es läuft im Hintergrund und liest alle drei Sekunden mit getenv() die Umgebungsvariable "VERBOSE" aus. (siehe Listing)

Wenn ich nun also auf der Konsole, auf der ich das Programm gestartet habe ("./meinProgramm &"), mit export die Umgebungsvariable VERBOSE ändere, kümmert sich das Programm nicht drum. Aber genau das will ich!
Ich würde mal sagen du unterliegst hier einem Denkfehler.

In dem Moment, wenn du dein Programm startest werden die exportierten Umgebungsvariablen für den neuen Kindprozess generiert und vom Vaterprozess (bei dir also der shell) kopiert. Wenn du danach wiederum auf deiner shell (also dem Vaterprozess deines Programmes) die Variablen änderst oder neu exportierst oder was auch immer bleiben schon laufende Kindprozesse davon vollkommen unberührt, diese haben jetzt eigene Variablen die mit denen des Vaterprozesses gar nichts mehr zu tun haben und somit kannst du Variablen nur aus dem eigenen Prozess heraus ändern.

robi
 
OP
Phillinger

Phillinger

Member
Mja, nicht ganz Denkfehler, ich hab's mir so ähnlich schon gedacht. Oder besser befürchtet. ;)

Ich dachte, es gibt aber vielleicht dennoch eine Möglichkeit, den Kontext des Kindprozesses (und damit auch seine Umgebungsvariablen) noch nachträglich von "außen" (i.e. von der Konsole aus) zu beeinflussen.

/edit: Ich könnte natürlich auch Pipes benutzen, um den Prozess im Nachhinein noch zu beeinflussen. Aber interessant wäre es trotzdem zu wissen, ob/wie man Umgebungsvariablen von Prozessen von außen beeinflussen kann.
 

regexer

Advanced Hacker
Phillinger schrieb:
Aber interessant wäre es trotzdem zu wissen, ob/wie man Umgebungsvariablen von Prozessen von außen beeinflussen kann.
Ich würde sogar sagen: Hoffentlich geht das nicht! Das würde ja sämtlichen Sicherheitsrichtlinien für Betrübsysteme widersprechen. Es dürfte nicht möglich sein, einfach so auf den Speicherbereich eines anderen Prozesses zugreifen zu können...
 
OP
Phillinger

Phillinger

Member
Da hast du natürlich recht. Ich denke, ich löse das ganze per Pipe, pfeiff' auf Umgebungsvariablen. Ich setze den Thread mal auf gelöst, wenn natürlich jemand noch etwas interessantes hinzufügen möchte: Bitte. :)
 
Oben