相关疑难解决方法(0)

关于putenv()和setenv()的问题

我一直在考虑环境变量,并有一些问题/观察.

  • putenv(char *string);

    这个电话似乎有致命的缺陷.因为它不复制传递的字符串,所以无法使用本地调用它,并且无法保证堆分配的字符串不会被覆盖或意外删除.此外(尽管我还没有测试过),因为环境变量的一个用途是将值传递给子环境,如果子进程调用其中一个exec*()函数,这似乎没用.我错了吗?

  • Linux手册页指出glibc 2.0-2.1.1放弃了上述行为并开始复制字符串,但这导致了glibc 2.1.2中修复的内存泄漏.我不清楚这个内存泄漏是什么或它是如何修复的.

  • setenv()复制字符串,但我不确切知道它是如何工作的.当进程加载但是它被修复时,将分配环境空间.这里有一些(任意?)惯例吗?例如,在env字符串指针数组中分配比当前使用的更多的插槽,并根据需要向下移动空终止指针?是否在环境本身的地址空间中分配了新的(复制的)字符串的内存,如果它太大而不适合您只需获得ENOMEM?

  • 考虑到上述问题,有什么理由,更喜欢putenv()setenv()

c unix linux environment-variables setenv

38
推荐指数
3
解决办法
2万
查看次数

如何在C中使用setenv避免此错误?

首先披露:我不是一个C程序员.我正在尝试编译一组具有很多谱系的C和Fortran代码,使用Makefile生成工程计算的可执行文件.我在sgi Irix(6.5.30)上使用gcc 4.7.1.在编写主程序时,首先我收到关于'隐式声明函数'setenv'的警告.随后,在生成所有目标"o"文件后,编译以错误结束:

ld32:错误33:未解析的数据符号"setenv"

注释掉定义'setenv'的单行允许编译成功并生成可执行文件.然而,与setenv的关系对该计划至关重要.

这导致我编写测试代码并确认同样的问题:

#define _GNU_SOURCE
#include <stdio.h>
#include <stdlib.h>
int main()
{
   setenv("FILE","/usr/bin/example.c",50);
   printf("File = %s\n", getenv("FILE"));
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

根据我在堆栈交换和其他网站上搜索时发现的所有建议,我尝试包括不同的标题

#define _POSIX_C_SOURCE
Run Code Online (Sandbox Code Playgroud)

#define _GNU_SOURCE
Run Code Online (Sandbox Code Playgroud)

在任何#define语句之前.我也试图与编制-std=c99,以及-D_XOPEN_SOURCE-D_GNU_SOURCE没有运气.

我也尝试使用Irix的本机C编译器(cc和c99)编译测试程序,我得到了同样的错误:

未解决的文字符号'setenv'

有人可以帮助我在我的系统和/或环境变量中寻找其他什么来解决这个错误吗?

c gcc posix irix

7
推荐指数
1
解决办法
799
查看次数

为什么我的包装器setenv()不能正常工作?

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

c setenv

3
推荐指数
1
解决办法
3981
查看次数

标签 统计

c ×3

setenv ×2

environment-variables ×1

gcc ×1

irix ×1

linux ×1

posix ×1

unix ×1