关于fork以及子shell继承环境变量的疑问

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

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

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

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

这里讲解一下fork and exec 过程调用流程

      进程都会通过父进程以复制(fork)的方式产生一个一莫一样的子进程,然后被复制出来的子进

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值