Warum ist nicht mein Wrapper um setenv () zu arbeiten?
Frage
Ich habe das Verfahren unten, und setzt sie korrekt den Ret-Wert auf 0 (zeigt Erfolg in setenv), aber wenn ich überprüfen, um zu sehen, ob diese Umgebungsvariable tatsächlich eingestellt wird, ist es nicht vorhanden. Warum sollte dies geschehen?
void Class::mysetenv(char* a, char* b)
{
if(a==0 || b==0)
return;
int ret = setenv(strdup(a), strdup(b), 1);
printf("ret: %d %s %s\n", ret, a, b);
}
Lösung
Ihre Funktion Lecks. Die Manpage von setenv
sagt:
Diese Funktion macht Kopien der Saiten, auf den Namen und den Wert
Sie brauchen also nicht selbst kopieren, bevor sie es vorbei.
Haben Sie ausführen Ihr Programm wie folgt aus der Schale?
./a.out FOO 42
Nun, dann wird die Umgebungsvariable für den Prozess so ausgeführt wird gesetzt (a.out
) und auf die Prozesse von ihrem eingeleitete vererbt werden. Aber es wird nicht „sprudeln“ in die Schale, die a.out
ausgeführt. Das ist auch der Grund, warum Befehle wie set
oder export
sind Shell-Einbauten, anstatt echte Programme. Zur Kasse "Hilfe export" in bash.