Chinaunix首页 | 论坛 | 博客
  • 博客访问: 156727
  • 博文数量: 13
  • 博客积分: 45
  • 博客等级: 民兵
  • 技术积分: 871
  • 用 户 组: 普通用户
  • 注册时间: 2011-09-02 10:59
个人简介

Nobody.

文章分类

全部博文(13)

文章存档

2013年(13)

分类: 系统运维

2013-05-14 12:00:41

shell里,有这样的说法“在我目前这个shell的情况下,去启用另一个新的shell,新的那个shell 就是子程序啦!在一般的状态下,父程序的自定义变量是无法在子程序内使用的。但是透过export将变量变成环境变量后,就能够在子程序底下应用了”。

但是在C里,父进程调用fork()创建子进程,子进程成为父进程的副本,复制父进程的所有进程内存到其内存地址空间中。父、子进程的“数据段”,“堆栈段”和“代码段”完全相同,即子进程中的每一个字节都和父进程一样。fork之后,从 fork 处开始父子进程并行执行,公有变量的值也在 fork 处被复制(当时的值),只不过父子进程分别使用各自的复本(而非共享)。

     我对上面的两段话就有点不理不啦,觉得有点矛盾,应该子shell自动继承父shell的变量啊。直到今天意识到忽略了一点。在开启子shell的时候,是fork+exec的模式,系统调用exec是以新的进程去代替原来的进程,原进程的代码段,数据段,堆栈段被新的进程所代替,所以父进程的变量是不会再存在于子进程了。而且exec可以接受一个指向环境字符串指针数组的指针,意思是把新的环境变量指定到新的进程中去,若不提供该指针则将原来的环境变量(即父进程的)默认为新进程的环境变量。

       这样,子shell只能继承父shell的环境变量,并且子shell对环境变量的修改不会影响到父shell就可以理解了。

    不知道以上的理解是否合理,还望高手指教!

阅读(4160) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~