当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 4 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [问题]环境变量在内存中的位置
帖子发表于 : 2006-12-20 17:17 

注册: 2006-08-06 21:02
帖子: 7
送出感谢: 0 次
接收感谢: 0 次
写了一个打印环境变量地址的程序:
代码:
//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


问题:为什么两次执行程序输出的环境变量地址不一样?是每一个进程都有自己单独的环境变量拷贝吗?


页首
 用户资料  
 
2 楼 
 文章标题 :
帖子发表于 : 2006-12-20 17:51 
头像

注册: 2006-01-19 11:55
帖子: 1114
地址: HUST
送出感谢: 0 次
接收感谢: 0 次
em,好像是的。比如有些执行脚本,因为要使用到本地的库,往往是这样的:
#!/bin/bash
export *****//设置临时的环境变量,指向某个库
exec ...//执行程序

这样就可以做一些解压就运行的程序了。
进程的执行应该就是exec 这里开始的,它应该是先要读取相应环境变量的。


_________________
http://www.classfoo.org


页首
 用户资料  
 
3 楼 
 文章标题 :
帖子发表于 : 2006-12-20 20:42 

注册: 2006-08-06 21:02
帖子: 7
送出感谢: 0 次
接收感谢: 0 次
我试着查看了几个程序的环境变量,是每个进程都在自己的地址空间保留了一份环境变量的副本,一个进程的地址空间比实际代码所要求的地址空间要大很多。

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

这样就可以做一些解压就运行的程序了。
进程的执行应该就是exec 这里开始的,它应该是先要读取相应环境变量的。


页首
 用户资料  
 
4 楼 
 文章标题 :
帖子发表于 : 2006-12-22 18:53 
头像

注册: 2006-01-19 11:55
帖子: 1114
地址: HUST
送出感谢: 0 次
接收感谢: 0 次
不知道这和fork()与vfork()区别有没有关系。
实在不理解就直接看内核里面进程创建的内容吧,呵呵,我是没这能力的。。。。


_________________
http://www.classfoo.org


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 4 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译