【发布时间】:2012-03-10 18:24:31
【问题描述】:
“子继承父环境”是什么意思?通过复制整个环境来继承,还是通过接收指向同一环境的指针来继承(以某种方式)?
这是我的场景:
- 我有一个正在运行的进程
P有自己的环境(变量) - 在某些时候,
P执行fork - 在
if-statement(也就是子进程C)的0-clone 中,执行execv - 两个进程继续独立运行。
因此,在某个时刻,应用程序停止正常工作。原因是 - “破碎”的环境。
有趣的是,两个环境都发生了变化。当我启动父进程并执行时
$ cat /proc/PID/environ
对于两者 - 父进程和进程,一切都很好。几个小时后,应用程序停止工作,当我再次执行上面的行(检查环境)时,两者都已更改并且缺少很多环境变量 - 只有标准变量存在(如PWD、HOME 、USER 等)。
这怎么可能?问题可能出在哪里——在孩子身上还是在父母身上?
编辑:感谢大家的回答,我 +1,因为他们都是正确的(@caf、@Saphrosit 和 @R..)。这个问题的原因真的很傻。。
所有环境变量都放在/etc/profile 中,在登录后执行(那个..我不知道)。
好吧,看来问题是在重新启动机器时发生的。因此,在启动时,应用程序再次启动,但 /etc/profile/ 未 执行/读取。这会导致不良行为。这就是问题在手动重启时消失的原因 - 一旦登录root(通过ssh),读取来自/etc/profiles的环境变量,并且当重新启动父进程时(通过root),它是一切都很好 - 环境变量是继承的。
愚蠢的错误。
【问题讨论】:
-
您是否曾从父母那里致电
wait或waitpid?否则,子进程终止后仍将是僵尸进程。 -
疯狂猜测 - 可能两者都死了并重新启动,环境错误?如果是这样,您会看到 PID 已更改。
-
@ugoren - 有可能,我还找不到有关此的信息。但即使是这样——所有的环境变量都设置在
/etc/profile中,它们并没有在shell中手动导出..所以,即使是这样,我也无法想象有什么东西可以“破坏”环境如此糟糕跨度> -
@BlagovestBuyukliev - 是的,父级中有一个
waitpid。但这有多重要?我的意思是,这会以某种方式影响环境吗? (我知道我需要阅读更多关于守护进程的信息,我正在研究这个:))
标签: c++ c unix process environment-variables