LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1260|回复: 12

谈谈环境变量的设置,init与Shell

[复制链接]
发表于 2008-5-13 20:41:27 | 显示全部楼层 |阅读模式
"I'm the Alpha and the Omega."

好吧,我承认引用圣经是故弄玄虚。其实我只是想说我们要意识到最初最初的进程的存在——一切的始于init,一切终于init。文件系统,网络,X,QQ还有WOW都这样。

1.进程如何开始
通常来说,一个进程是他的父进程fork得到的,我们姑且认为这是Unix世界创造的唯一方式,就像生育是得到人的唯一方式一样。fork()创建调用进程的一个拷贝,比如以下程序

/* Includes */
#include /* Symbolic Constants */
#include /* Primitive System Data Types */
#include /* Errors */
#include /* Input/Output */
#include /* Wait for Process Termination */
#include /* General Utilities */

int main()
{
pid_t childpid; /* variable to store the child's pid */
childpid = fork();

if (childpid >= 0) /* fork succeeded */
{
if (childpid == 0) /* fork() returns 0 to the child process */
{
printf("CHILD: I am the child process!\n");
execv(argv[1],&(argv[2]));
exit(0); /* child exits with user-provided return code */
}
else /* fork() returns new pid to the parent process */
{
printf("ARENT: I am the parent process!\n");
wait(&status); /* wait for child to exit, and store its status */
exit(0); /* parent exits */
}
}
}

这个程序是一个小型的shell。一个新进程的创建通常是像上边的例子里,通过fork+exec创建。fork出来的进程是父进程的拷贝,也就是说 shell程序fork出来仍然是shell程序,但是使用不同的进程号,不同的内存空间。fork很重要的一个特性是子进程继承父进程的资源(文件描述符,与环境变量)。exec()系统调用使用某一个程序镜像覆盖当前程序,并执行该程序。一般shell执行一个程序时,先fork,创建出自身的一个拷贝,然后在子进程通过exec系统调用加在要执行程序的二进制镜像,然后这个shell的子进程就变成我们需要的程序了。

这里的关键点是:fork()调用时,子进程继承了父进程的环境变量,还有文件描述符。

2.如何向进程传值
一般来说,调用一个程序,向它传递数据的方式有两种,argument和envirenment。

3.从init到X
系统内核在加在并检测完硬件后,创建系统的第一个进程init,也就是在ps中看到的进程号为1的进程,在现代Unix系统中,这个进程是一个shell脚本。在Gentoo中,该脚本会从/etc/profile中加在环境变量,而这个profile是根据/etc/profile.d/中的内容生成的。在该init进程中,还将初始化终端,启动系统服务,这些就不细说了。在每个终端上将会运行一个gettty程序,该程序重复执行login程序,当通过 login验证后,将会fork出一个shell来,这就是用户登录后与系统交互的开始!gdm是同样的道理,gdb占据图形终端,进行验证,当验证通过后exec为用户的图形会话程序。在用户的主目录下有名为.profile,.bashrc的文件,当你等入系统并执行你的shell时,会加载这些东西。所有的进程构成一棵树,而init就是树的根节点,是最开始,是最终!

4.环境变量的设置
通过上边的叙述,可见有三个地方修改环境变量
a,/etc/profile中的环境在init进程中被设置,这意味这这些环境变量是系统级别的全局环境变量,任何从init中fork出来的进程都继承这些环境变量,也就是说有进程都继承这些环境变量
b,~/.profile中的环境变量在用户登录shell中被设置,也就是说当一个用户一等入shell这些环境变量就存在,并影响随后启动的所有程序,所以这里是个人的全局变量
c,~/.dmrc中的环境变量在你一登入GDM由GDM加载,也就是说会影响你通过GDM登录后启动的所有程序,所以这里是X的全局变量,虽然,这里只有一个环境变量LANG可设置
d,在登录shell后设置的环境变量。根据fork的功能,这些环境变量将影响所有从这个进程fork出来的进程。

5.设置环境变量的建议
建议只有一条——尽量把环境变量设置成局部,让它影响的进程己可能少。比如LANG将会使shell输出中文提示,如果你把他设置在~/.profile 里,那么你一登录,就会使用中文提示,如果你刚好使用不支持中文的终端,那没就会显示乱码。如果LANG设置在/etc/profile中,那么连启动提示都是中文/乱码。所以我们最好把它设置在~/.dmrc中,这样只有X环境的程序才会使用中文,就说这一个例子了...

6.进程的终结
waitpid系统调用将会等待特定进程结束,init就通过waitpid等待他的子进程结束,在系统关机的时候,进程将一个一个消逝,init不断接近等待的终点

PS:Unix与Windows最大的不同就是其设计中的哲学性。作为一个老Linux用户不能领悟这一点是很遗憾的
发表于 2008-5-13 21:15:15 | 显示全部楼层
Post by Reiase;1849199
在现代Unix系统中,这个进程是一个shell脚本


基本上没有什么问题
不过,这句话至少在gentoo里是不成立的
不知道老兄说的是哪个现代Unix系统
file /sbin/init
/sbin/init: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), stripped
回复 支持 反对

使用道具 举报

发表于 2008-5-13 21:40:25 | 显示全部楼层
a,/etc/profile中的环境在init进程中被设置,这意味这这些环境变量是系统级别的全局环境变量,任何从init中fork出来的进程都继承这些环境变量,也就是说有进程都继承这些环境变量

这个有待商榷,APUE中第9章说init以空环境执行getty程序,所以在init进程中的任何环境变量并不会传递下去,/etc/profile这个文件是由登录shell读取的。
回复 支持 反对

使用道具 举报

发表于 2008-5-13 22:04:51 | 显示全部楼层
看不懂,不过我觉得楼主排版很糟糕,哈哈~
回复 支持 反对

使用道具 举报

发表于 2008-5-13 22:52:55 | 显示全部楼层
以偏概全
混淆视听
冒充先知
回复 支持 反对

使用道具 举报

发表于 2008-5-13 23:13:40 | 显示全部楼层
Post by 1987a;1849306
以偏概全
混淆视听
冒充先知

说得太重了……
回复 支持 反对

使用道具 举报

发表于 2008-5-13 23:49:51 | 显示全部楼层
Post by sephinroth;1849318
说得太重了……

向 ls 和 lz 道歉先。
问题依然是问题,敢贴出来自然敢承担,说的是重,但不过分。
回复 支持 反对

使用道具 举报

发表于 2008-5-14 01:02:48 | 显示全部楼层
楼主介绍的是unix操作系统原理吧,N多年前我看过,有点印象

只是简单模型,现在任何一个新发行版可能都有自己新的实现方式。

原理只是讲理。大家别计较细节
回复 支持 反对

使用道具 举报

发表于 2008-5-14 01:30:31 | 显示全部楼层
Post by ocean390;1849248
这个有待商榷,APUE中第9章说init以空环境执行getty程序,所以在init进程中的任何环境变量并不会传递下去,/etc/profile这个文件是由登录shell读取的。


apue讲述的是很老的unix
现在是否还是这样,恐怕只有研究了代码才能知道

不过可以肯定的是,/etc/profile确实是bash读取的
其他shell是否读取这个文件,由于我不熟悉,还不敢妄下定论
回复 支持 反对

使用道具 举报

发表于 2008-5-14 02:04:00 | 显示全部楼层
我刚看了sysvinit的源代码
可以确定init不会自己读取/etc/profile
只能间接的通过调用shell或者调用sulogin(sulogin会exec shell)来让shell读取profile.
回复 支持 反对

使用道具 举报

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

本版积分规则

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