LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
楼主: freesky64

问:Gentoo Linux的工作原理?

[复制链接]
发表于 2005-6-1 15:56:39 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2005-6-1 16:44:17 | 显示全部楼层
还是zhllg兄说得中肯
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-1 17:42:37 | 显示全部楼层
Post by zhllg
每个进程都有自己的环境变量,在进程地址空间的堆栈底部,main函数的参数(argc,argv)的上方
每个进程都有能力改变的自己的环境变量
man 3 setenv
man 3 getenv
man 3 putenv
man 3 clearenv
man 5 environ
不是每个进程都会去改变自己的环境变量
但基本都会根据自己的环境变量来决定自己的行为方式

shell变量就是shell里的环境变量
和一般的进程的环境变量相比,它有更重要的意义
因为除了守护进程其他进程都是shell启动的
export了的bash的环境变量就可以在fork的时候传递给子进程
子进程就可以根据从shell继承过来的环境变量,决定自己的行为
还有就是shell是交互式的,改变环境变量也容易



谢谢zhllg的精彩回答。按照你的方法,我实验了一下,看到了。呵呵,下面说说我的理解看对不对:

环境变量是每一个进程(内存映像?)里的一部分,当用fork系统调用创建一个进程时,子进程得到父进程环境变量表的一个副本。如果是用shell启动一个进程的话,这个进程就会得到shell export 了的bash环境变量。而没有export的shell环境变量就不复制到子进程。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-1 18:02:25 | 显示全部楼层
刚才做了个实验,开了两个xterm,

1、
在第一个xterm里输入:
ENV=“my test env"
echo $ENV
得到:
my test env
第二个xterm里执行echo $ENV
没有输出

2、
第一个xterm里 用gdb查看环境变量
没有发现ENV这个变量

3、在第一个xterm里
export ENV=“my test env"
用gdb a.out查看环境变量,有ENV这个变量了。

4、
第一个xterm里
export ENV=“my test env"后,到第二个xterm里echo $ENV
没有结果

5、关掉第一个xterm,在第二个xterm里
用gdb a.out查看环境变量,没有ENV这个变量。

以上结果说明什么呢?我理解为:不用export 的环境变量只是在当前shell的交互中可以使用;export后就对由export 的shell启动的进程都可以访问这个环境变量了。而不管有没有export这个环境变量,不是由这个shell启动的进程都不能访问。

方家指正!
回复 支持 反对

使用道具 举报

发表于 2005-6-1 18:18:38 | 显示全部楼层
父进程可以通过export把环境变量传给子进程,而不相干的进程不可以,在子进程独立运行之后,父进程也就无能为力了,fork实现的就是拷贝,把父进程拷贝一份
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-1 18:32:27 | 显示全部楼层
那么这个export是什么?系统调用?还是bash的内部命令?还是一个小程序?
回复 支持 反对

使用道具 举报

发表于 2005-6-1 18:45:07 | 显示全部楼层
应该是内部命令,如果没有export的话,他就自己保存起来,不是保存在env中,
我没看过bash的源代码,你可以看一下
回复 支持 反对

使用道具 举报

发表于 2005-6-1 19:23:16 | 显示全部楼层
我想如果你理解了下面的C程序会对你有所帮助:)
#include <stdio.h>

int main(int args, char *argv[], char **env)
{
        while(*env)
        {
                printf("%s\n", *env++);
        }
}
回复 支持 反对

使用道具 举报

发表于 2005-6-1 21:51:56 | 显示全部楼层
回复 支持 反对

使用道具 举报

发表于 2005-6-1 22:32:40 | 显示全部楼层
Post by freesky64


以上结果说明什么呢?我理解为:不用export 的环境变量只是在当前shell的交互中可以使用;export后就对由export 的shell启动的进程都可以访问这个环境变量了。而不管有没有export这个环境变量,不是由这个shell启动的进程都不能访问。


是对的
export是内部命令
就像ulimit, umask
内部命令可以用help查看用法
help export
help ulimit
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表