繁体   English   中英

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

[英]Can the child process affect parent process' environment?

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


这是我的情况:

  1. 我有一个正在运行的进程P及其自己的环境(变量)
  2. 在某个时候, P执行fork
  3. if-statement0 -clone(又称为子进程C )中,执行execv
  4. 这两个过程将继续独立运行。

因此,在某个时刻,该应用程序停止正常运行。 原因是-“损坏”的环境。

有趣的是,这两种环境都已更改。.当我启动父流程并执行时

$ cat /proc/PID/environ

对于父级和流程而言,一切都很好。 几个小时后,该应用程序停止运行,当我再次执行以上代码行(以检查环境)时,两者均被更改,并且缺少许多环境变量-仅存在标准变量(如PWDHOMEUSER等) )。

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


编辑:感谢所有的答复,从我+1,因为它们都是正确的(@ caf,@ Saphrosit和@R ..)。 这个问题的原因确实很愚蠢。

所有环境变量都放在/etc/profile ,该/etc/profile在登录后执行(我不知道)。

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

愚蠢的错误。

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

唯一可以更改此方法的方法是做一些非常奇怪的事情,例如将环境放在MAP_SHARED区域中,或使用ptrace() 但是,如果您执行了类似的操作,您就会知道。

...还是两者兼而有之?

孩子从父环境开始复制,因此不会影响其父环境。 所以我不认为孩子会改变父亲的环境,但也许父亲会改变自己的环境。

不知道程序到底是做什么的,很难说出问题出在哪里...

如果没有更多细节,这个问题实际上几乎是不可能回答的,但是无论如何我还是要刺耳吗?

您确定调用fork时环境的内容确实有效吗? 您肯定有可能破坏了内存,但父级此时已经获取并缓存了它关心的变量的副本,并且只有在稍后尝试重新获取它时,它才会中断。 如果是这种情况,孩子也应该破坏环境,但是孩子可能不在乎...

如果这不是问题,那么工作系统上剩下的唯一可能性似乎是父级正在重新启动而您不知道它,或者父级在fork后破坏了自己的环境。

否则,也许您在损坏的设备上有一个交换分区,并且当交换回原位时,环境正被交换出并损坏...?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM