[问题]环境变量在内存中的位置

C、C++和Java语言
回复
bismy
帖子: 7
注册时间: 2006-08-06 21:02
送出感谢: 0
接收感谢: 0

[问题]环境变量在内存中的位置

#1

帖子 bismy » 2006-12-20 17:17

写了一个打印环境变量地址的程序:

代码: 全选

//getenvaddr.c
#include<stdio.h>
#include<stdlib.h>

int main(int argc,char **argv){
	char *env;
	if(argc<2){
		printf("Usage: %s env\n",argv[0]);
                return 1;
	}
	env=getenv(argv[1]);
	printf("%s @ %p : %s\n",argv[1],env,env);
	return 0;
}

代码: 全选

gcc -o getenvaddr getenvaddr.c
./getenvaddr PATH
PATH @ 0xbfb97d49 : /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games
./getenvaddr PATH
PATH @ 0xbffffd49 : /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/bin/X11:/usr/games
问题:为什么两次执行程序输出的环境变量地址不一样?是每一个进程都有自己单独的环境变量拷贝吗?
头像
juanzhewudi
帖子: 1114
注册时间: 2006-01-19 11:55
来自: HUST
送出感谢: 0
接收感谢: 0
联系:

#2

帖子 juanzhewudi » 2006-12-20 17:51

em,好像是的。比如有些执行脚本,因为要使用到本地的库,往往是这样的:
#!/bin/bash
export *****//设置临时的环境变量,指向某个库
exec ...//执行程序

这样就可以做一些解压就运行的程序了。
进程的执行应该就是exec 这里开始的,它应该是先要读取相应环境变量的。
bismy
帖子: 7
注册时间: 2006-08-06 21:02
送出感谢: 0
接收感谢: 0

#3

帖子 bismy » 2006-12-20 20:42

我试着查看了几个程序的环境变量,是每个进程都在自己的地址空间保留了一份环境变量的副本,一个进程的地址空间比实际代码所要求的地址空间要大很多。
juanzhewudi 写了:em,好像是的。比如有些执行脚本,因为要使用到本地的库,往往是这样的:
#!/bin/bash
export *****//设置临时的环境变量,指向某个库
exec ...//执行程序

这样就可以做一些解压就运行的程序了。
进程的执行应该就是exec 这里开始的,它应该是先要读取相应环境变量的。
头像
juanzhewudi
帖子: 1114
注册时间: 2006-01-19 11:55
来自: HUST
送出感谢: 0
接收感谢: 0
联系:

#4

帖子 juanzhewudi » 2006-12-22 18:53

不知道这和fork()与vfork()区别有没有关系。
实在不理解就直接看内核里面进程创建的内容吧,呵呵,我是没这能力的。。。。
回复

回到 “C/C++/Java”