子进程会影响父进程的环境吗?

Kir*_*rov 2 c c++ unix process environment-variables

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


这是我的场景:

  1. 我有一个正在运行的进程P,有自己的环境(变量)
  2. 在某个时刻,P执行fork
  3. 在(也称为子进程中)0的克隆中,执行if-statementCexecv
  4. 两个进程继续独立运行。

因此,在某个时刻,应用程序会停止正常工作。原因就是——“破碎”的环境。

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

$ cat /proc/PID/environ
Run Code Online (Sandbox Code Playgroud)

对于父母和进程来说,一切都很好。几个小时后,应用程序停止工作,当我再次执行上面的行(以检查环境)时,两者都发生了更改,并且丢失了很多环境变量 - 只有标准变量存在(如 、PWDHOMEUSER)。

这怎么可能?问题出在哪里——孩子还是父母?


编辑:感谢大家的回答,我+1,因为它们都是正确的(@caf、@Saphrosit 和@R..)。这个问题的原因实在是太蠢了。。

所有环境变量都放置在/etc/profile登录后执行的位置(那..我不知道)。

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

愚蠢的错误。

caf*_*caf 5

子进程继承了父进程当前环境的副本fork()。任一进程中环境的后续更改不会影响另一个进程。

改变这一点的唯一方法是做一些非常奇怪的事情,比如将环境放置在一个MAP_SHARED区域中,或者使用ptrace(). 不过,如果你做了这样的事情,你就会知道。