Pourquoi mon wrapper autour de setenv () ne fonctionne-t-il pas?
Question
J'ai la méthode ci-dessous, et elle définit correctement la valeur de ret sur 0 (indiquant le succès dans setenv), mais lorsque je vérifie que cette variable d'environnement est réellement définie, elle est absente. Pourquoi cela se produirait-il?
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);
}
La solution
Votre fonction présente des fuites. La page de manuel de setenv
dit:
Cette fonction crée des copies des chaînes désignées par leur nom et leur valeur
Donc, vous n’avez pas à les copier vous-même avant de les y passer.
Exécutez-vous votre programme comme cela depuis le shell?
./a.out FOO 42
Eh bien, la variable d'environnement sera définie pour le processus ainsi exécuté (a.out
) et sera héritée des processus qu'il a lancés. Mais cela ne > ne fera pas de bulles & "; dans le shell qui a exécuté set
. C’est aussi la raison pour laquelle les commandes telles que export
ou <=> sont intégrées au shell plutôt que de véritables programmes. Commander & Quot; aide à exporter & Quot; en bash.