Perché il mio wrapper intorno a setenv () non funziona?
Domanda
Ho il metodo seguente e imposta correttamente il valore ret su 0 (che indica il successo in setenv), ma quando controllo per vedere se questa variabile di ambiente è effettivamente impostata, è assente. Perché dovrebbe succedere?
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);
}
Soluzione
La tua funzione perde. La manpage di setenv
dice:
Questa funzione crea copie delle stringhe indicate da nome e valore
Quindi non è necessario copiarli da soli prima di passarli.
Esegui il tuo programma in questo modo dalla shell?
./a.out FOO 42
Bene, allora la variabile d'ambiente verrà impostata per il processo così eseguito (a.out
) e verrà ereditata dai processi avviati da essa. Ma non & Quot; rimbalza & Quot; nella shell che ha eseguito set
. Questo è anche il motivo per cui comandi come export
o <=> sono integrati nella shell piuttosto che programmi reali. Acquista & Quot; aiuta a esportare & Quot; in bash.