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

Can the child process affect parent process' environment?

本文关键字:环境 进程 是否 影响 子进程      更新时间:2023-10-16

"子级继承父级环境"是什么意思?通过复制整个环境来继承,还是通过接收指向同一环境的指针来继承(不知何故)?


这是我的场景:

  1. 我有一个正在运行的进程P,它有自己的环境(变量)
  2. 在某个时刻,P执行fork
  3. if-statement0克隆中(也就是在子进程C中),执行execv
  4. 两个进程继续独立运行

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

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

$ cat /proc/PID/environ

对于父母和过程来说,一切都很好。几个小时后,应用程序停止工作,当我再次执行上面的行(检查环境)时,两者都发生了变化,并且缺少了很多环境变量——只有标准的变量(如PWDHOMEUSER等)

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


编辑:感谢所有人的回答,+1,因为他们都是正确的(@caf、@Saphrosit和@R..)。这个问题的原因真的很傻。。

所有的环境变量都放在/etc/profile中,CCD_11在LOGIN之后执行(我不知道)。

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

愚蠢的错误。

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

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

。。。还是两者都有?

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

如果不知道这个程序到底是做什么的,很难说问题出在哪里。。。

如果没有更多的细节,这个问题真的几乎不可能回答,但我无论如何都要尝试一下?

您确定在调用fork时环境的内容实际上是有效的吗?当然,您有可能损坏了内存,但父级已经获得并缓存了它此时关心的变量的副本,只有在稍后尝试重新获得一个副本时才会中断。如果是这样的话,孩子的环境也应该被破坏,但孩子可能不在乎。。。

如果这不是问题所在,那么工作系统上剩下的唯一可能性似乎是,要么是父系统正在重新启动,而你没有意识到,要么是该父系统在fork ing后破坏了自己的环境。

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