Kir*_*rov 2 c c++ unix process environment-variables
“孩子继承父母的环境”是什么意思?通过复制整个环境来继承,还是通过接收指向同一环境的指针来继承(以某种方式)?
这是我的场景:
P,有自己的环境(变量)P执行fork0的克隆中,执行if-statementCexecv因此,在某个时刻,应用程序会停止正常工作。原因就是——“破碎”的环境。
有趣的是,两个环境都改变了。当我启动父进程并执行时
$ cat /proc/PID/environ
Run Code Online (Sandbox Code Playgroud)
对于父母和进程来说,一切都很好。几个小时后,应用程序停止工作,当我再次执行上面的行(以检查环境)时,两者都发生了更改,并且丢失了很多环境变量 - 只有标准变量存在(如 、PWD、HOME等USER)。
这怎么可能?问题出在哪里——孩子还是父母?
编辑:感谢大家的回答,我+1,因为它们都是正确的(@caf、@Saphrosit 和@R..)。这个问题的原因实在是太蠢了。。
所有环境变量都放置在/etc/profile登录后执行的位置(那..我不知道)。
嗯,看来问题是在重新启动机器时发生的。因此,在启动时,应用程序会再次启动,但/etc/profile/不会执行/读取。这会导致不良行为。这就是为什么手动重新启动时问题消失的原因 - 一旦 aroot登录(通过ssh),环境变量就会/etc/profiles被读取,并且当父进程重新启动(通过root)时,一切都很好 - 环境变量被继承。
愚蠢的错误。
子进程继承了父进程当前环境的副本fork()。任一进程中环境的后续更改不会影响另一个进程。
改变这一点的唯一方法是做一些非常奇怪的事情,比如将环境放置在一个MAP_SHARED区域中,或者使用ptrace(). 不过,如果你做了这样的事情,你就会知道。
| 归档时间: |
|
| 查看次数: |
3326 次 |
| 最近记录: |