3

我有下面的方法,它正确地将 ret 值设置为 0(表示 setenv 中的成功),但是当我检查这个环境变量是否实际设置时,它不存在。为什么会发生这种情况?

 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);                          
     }
4

1 回答 1

12

您的功能泄漏。的联机帮助页setenv说:

此函数复制名称和值所指向的字符串

因此,在将它们传递给它之前,您不必自己复制它们。

您是否从外壳中执行这样的程序?

./a.out FOO 42

好了,那么环境变量就会被设置为被执行的进程(a.out),并被继承给它启动的进程。但它不会“冒泡”到执行的 shell 中a.out。这也是为什么诸如setor之类的命令export是 shell 内置而不是真正的程序的原因。在 bash 中签出“帮助导出”。

于 2009-03-19T14:47:00.550 回答