首页 > 解决方案 > 这两个环境变量 (a) environ b) envp) 的实际字符串存储在哪里?

问题描述

我知道在运行时,environ是一个全局指针变量,最终存储在数据部分中。envp是main中定义的局部变量,所以存放在栈中或者栈顶。如果我错了,请纠正我。

但问题是,这两个环境的实际字符串信息存储在哪里?两者都在堆栈中?

我附上使用这两个环境变量的两个代码段。对于environ

#include <stdlib.h>
#include <stdio.h>
extern char **environ; 
int main(int argc, char **argv)
{ char **env_variable_ptr;
  env_variable_ptr = environ;
  while (*env_variable_ptr != NULL)
  { printf("%s\n", *env_variable_ptr);
    env_variable_ptr++;
  }
  printf("\n");
}

对于envp

int main(int argc, char **argv, char **envp){
    while(*envp != NULL){ 
    printf("%s\n", *envp);
    envp++;
    }
    printf("\n");
}

标签: clinuxprocessoperating-system

解决方案


参数向量、环境字符串和一些额外信息(基于 ELF 的系统上的“辅助向量”)通常放置在初始线程堆栈的底部之上。之所以使用这个位置,是因为操作系统必须在进程启动期间为堆栈创建一个读写地址范围并向其写入内容,因此它也可以将所有因调用而异的数据放在那里。

可以在您的 CPU 和操作系统的“特定于处理器的应用程序二进制接口”(psABI) 文档中指定。例如,请参阅x86-64/ELF psABI的“进程初始化”部分,该部分用于大多数基于 x86-64 的操作系统(Windows 除外),特别是第 32 页,其中讨论了“信息块。 "


推荐阅读