子进程是否会影响父进程的环境?
Can the child process affect parent process' environment?
"子级继承父级环境"是什么意思?通过复制整个环境来继承,还是通过接收指向同一环境的指针来继承(不知何故)?
这是我的场景:
- 我有一个正在运行的进程
P
,它有自己的环境(变量) - 在某个时刻,
P
执行fork
- 在
if-statement
的0
克隆中(也就是在子进程C
中),执行execv
- 两个进程继续独立运行
因此,在某个时刻,应用程序停止正常工作。原因是——"破碎"的环境。
有趣的是,这两种环境都发生了变化。。当我启动父进程并执行时
$ cat /proc/PID/environ
对于父母和过程来说,一切都很好。几个小时后,应用程序停止工作,当我再次执行上面的行(检查环境)时,两者都发生了变化,并且缺少了很多环境变量——只有标准的变量(如PWD
、HOME
、USER
等)
这怎么可能?问题出在哪里——孩子身上还是父母身上?
编辑:感谢所有人的回答,+1,因为他们都是正确的(@caf、@Saphrosit和@R..)。这个问题的原因真的很傻。。
所有的环境变量都放在/etc/profile
中,CCD_11在LOGIN之后执行(我不知道)。
看来,问题是在机器重新启动时发生的。因此,在启动时,应用程序会再次启动,但/etc/profile/
是而不是执行/读取。这导致了不良行为。这就是为什么手动重新启动时问题消失了——一旦root
登录(通过ssh
),就会读取/etc/profiles
中的环境变量,当父进程重新启动(通过CCD16)时,一切都很好——环境变量会被继承。
愚蠢的错误。
子级在fork()
时继承父级环境的副本。任何一个过程中对环境的后续更改都不会影响另一个过程。
改变这一点的唯一方法是做一些非常奇怪的事情,比如将环境放置在MAP_SHARED
区域中,或者使用ptrace()
。不过,如果你做了这样的事,你就会知道了。
。。。还是两者都有?
孩子从他父母环境的副本开始,所以不能影响他的父母环境。所以我不认为孩子改变了父亲的环境,但也许父亲改变了自己的环境。
如果不知道这个程序到底是做什么的,很难说问题出在哪里。。。
如果没有更多的细节,这个问题真的几乎不可能回答,但我无论如何都要尝试一下?
您确定在调用fork
时环境的内容实际上是有效的吗?当然,您有可能损坏了内存,但父级已经获得并缓存了它此时关心的变量的副本,只有在稍后尝试重新获得一个副本时才会中断。如果是这样的话,孩子的环境也应该被破坏,但孩子可能不在乎。。。
如果这不是问题所在,那么工作系统上剩下的唯一可能性似乎是,要么是父系统正在重新启动,而你没有意识到,要么是该父系统在fork
ing后破坏了自己的环境。
否则,也许你在一个损坏的设备上有一个交换分区,当它交换回来时,环境会被交换出去并损坏。。。?
- boost::进程间消息队列引发错误
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 是否可以通过C++扩展强制多个python进程共享同一内存
- IPC使用多个管道和分支进程来运行Python程序
- 枚举环境变量的惯用C++14/C++17方法
- 异常属于C++中的线程还是进程
- WMI检测进程创建事件-c++
- 在调用进程的上下文中通过 win32 执行批处理,从而保留环境变量
- 将 c++ 代码中的当前用户环境变量设置为对其他进程(如 cmds)可见
- 创建进程不继承父环境
- 创建C++守护进程并保护环境
- 检测 Linux 下的 32 位进程是否在 64 位环境中运行
- 使用execvp();执行进程时加载用户环境;
- 如何在Qt中以编程方式为当前进程设置环境变量
- 子进程是否会影响父进程的环境?
- 我们可以从父进程读取子进程的环境变量吗
- 如何使COM主机进程避免从父进程继承环境变量
- 将环境变量传递给已启动的进程bash脚本
- 在linux上用c++启动进程,使用环境变量c++
- 如何使子进程具有与 parrent 相同的环境变量,并在窗口中拥有自己的环境变量?