【问题标题】:Mechanism of modifying environment lists修改环境列表的机制
【发布时间】:2016-03-03 06:20:33
【问题描述】:

当我们做setenv()putenv() 时,《UNIX 环境中的高级编程》一书中说,当我们修改环境列表的值时,这很复杂。

基本上,环境列表存储在栈顶。

但是,书上说,在name=value结构中,如果我们将一个名字的旧值更改为一个大于旧值的新值,我们必须malloc()为新字符串获得空间,复制将新字符串指向该区域,然后将环境列表中对应名称的旧指针替换为指向该分配区域的指针(必须是堆区域,因为我们使用malloc())。

但是,基本上环境列表存储在堆栈的顶部。因此,新值必须位于此处,而不是堆区域(malloc() 的区域)。那么,为什么这个值在堆区而不是栈顶呢?

char** environ 全局变量,这个双指针指向指向name=value 字符串的指针数组。我认为这个name=value 字符串是environ 的指针数组所指向的数据之一。这就是为什么我无法理解指针指向堆区域的数组(在上述情况下存储新值)。

【问题讨论】:

    标签: c linux


    【解决方案1】:

    一旦您开始修改环境,就不需要将新信息放在堆栈的顶部。事实上,原始环境并不要求放置在堆栈的顶部,但这是它的常见位置。唯一的要求是environ指向一个以空结尾的char *值数组,每一个都是一个环境变量的值(顺序没有指定),这样getenv()就知道去哪里搜索了,而@ 987654325@、setenv()unsetenv() 知道要操作什么。如果你使用putenv(),那么基本上可以保证新的环境变量(或现有环境变量的新值)不会和原来的在同一个区域。没有什么可以阻止您在(只读)文本段或静态数组中分配的静态字符串中硬连线环境变量值。如果您使用setenv(),则新值可能在原始值中,但更有可能在其他位置。

    另见Questions about putenv() and setenv()

    【讨论】:

      猜你喜欢
      • 2019-04-30
      • 2016-06-25
      • 1970-01-01
      • 2014-01-11
      • 2017-07-16
      • 1970-01-01
      • 1970-01-01
      • 2011-01-14
      相关资源
      最近更新 更多