子进程是否会影响父进程的环境?

时间:2012-02-20 11:52:25

标签: c++ c unix process environment-variables

孩子继承父母的环境”是什么意思?通过复制整个环境继承,还是通过接收指向同一环境的指针继承(以某种方式)?


这是我的情景:

  1. 我有一个正在运行的进程P,它有自己的环境(变量)
  2. 在某些时候,P会执行fork
  3. 0 - if-statement的克隆(子进程C中的a.k.a.)中,执行了execv
  4. 两个进程都会继续独立运行。
  5. 因此,在某个时刻,应用程序停止正常工作。原因是 - “破碎”的环境。

    有趣的是,两个环境都发生了变化。当我启动父进程并执行

    $ cat /proc/PID/environ
    

    对于父母和过程,一切都很好。几个小时后,应用程序停止工作,当我再次执行上面的行(检查环境)时,两者都被更改,并且缺少许多环境变量 - 只有标准变量存在(如PWD,{ {1}},HOME等。)

    这怎么可能?问题在哪里 - 在孩子或父母身上?


    编辑: 感谢大家的回答,+1来自我,因为他们都是正确的(@ cd,@ Spahrosit和@R ..)。这个问题的原因真的很傻。

    所有环境变量都放在USER中,这是在登录后执行的(我不知道)。

    嗯,似乎问题是在重启机器时发生的。因此,在启动时,应用程序会再次启动,但/etc/profile 执行/读取。这会导致不良行为。这就是手动重启时问题消失的原因 - 一旦/etc/profile/登录(通过root),就会读取ssh的环境变量,以及重启父进程的时间(通过/etc/profiles),一切都很好 - 环境变量是继承的。

    愚蠢的错误。

3 个答案:

答案 0 :(得分:3)

孩子在fork()时刻继承了父母环境的副本。任何一个过程中对环境的后续更改都不会影响另一个过程。

您可以改变这种情况的唯一方法是做一些非常奇怪的事情,例如将环境置于MAP_SHARED区域或使用ptrace()。但是,如果你做了类似的事情,你就会知道。

答案 1 :(得分:2)

......或两者兼而有之?

孩子从父母环境的副本开始,因此不能影响他的父母环境。所以我不认为孩子改变了父亲的环境,但也许父亲改变了自己。

在不知道程序究竟是什么的情况下,很难说出问题出在哪里......

答案 2 :(得分:1)

如果没有更多详细信息,这个问题几乎不可能回答,但我还是会采取措施呢?

在您致电fork时,您确定环境内容实际上是否有效?你肯定可能损坏了内存,但是父进程已经获得并缓存了它关心的变量副本,并且只有在它尝试重新获取时才会破坏它。如果是这种情况,孩子的环境也应该被打破,但孩子可能不在乎...

如果这不是问题,那么工作系统上剩下的唯一可能性似乎是父进程重新启动而你没有意识到它,或者父进程在fork之后损坏了它自己的环境

否则,也许你在一个损坏的设备上有一个交换分区,并且当它被交换回来时,环境会被换出并被破坏??