【问题标题】:Why isn't my wrapper around setenv() working?为什么我的 setenv() 包装器不起作用?
【发布时间】:2009-03-19 14:42:03
【问题描述】:

我有下面的方法,它正确地将 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);                          
     }

【问题讨论】:

    标签: c setenv


    【解决方案1】:

    您的函数泄漏。 setenv 的联机帮助页说:

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

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

    你会在 shell 中这样执行你的程序吗?

    ./a.out FOO 42
    

    那么,环境变量会被设置为这样执行的进程(a.out),并被继承给它启动的进程。但它不会“冒泡”进入执行a.out 的shell。这也是为什么setexport 等命令是shell 内置而不是真实程序的原因。在 bash 中签出“帮助导出”。

    【讨论】:

    • 我正在从子线程的程序内部调用此函数。既然您提到冒泡,这是否意味着更改仅发生在子线程而不发生在父线程?
    • 如果你的意思是来自一个分叉的进程,是的,它只会影响你执行 setenv 的进程。父进程不会受到影响。在 fork 之前执行 setenv。
    • 那些不是“线程”而是“进程”。线程只是同一进程中的另一个执行路径。但你的那些是不同的进程在这里同样的错误:stackoverflow.com/questions/658431/…
    猜你喜欢
    • 1970-01-01
    • 2016-03-25
    • 1970-01-01
    • 2011-06-26
    • 2017-02-23
    • 1970-01-01
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多