是否可以从终端运行c ++应用程序并在某些条件下将命令返回到从中调用它的终端?例如,如果我在我的终端内运行应用程序并在我选择之后运行;我的应用程序需要通过运行导出命令来更改我的PATH,例如:
(使用BASH)
export PATH=.:/home/User/application/bin:$PATH
在我完成之后,在我的应用程序完全关闭之前,我可以使用上述命令使应用程序更改终端本地环境变量吗? Qt是否提供了这样做的方法?在此先感谢您的帮助!
答案 0 :(得分:1)
不,您无法更改父应用程序环境。
为什么呢?当您的父应用程序启动时(可能使用system()
),它实际上是fork()
ed - 子进程诞生时几乎是父进程的复制品,然后该子进程使用execve()
调用,用你的应用程序的可执行映像完全替换了该进程的可执行映像(对于脚本,它将像bash一样是解释器的映像)。
除此之外,该过程还准备了更多的东西。一个是打开文件列表,从文件句柄0,1,2(stdin,stdout,stderr)开始。此外,它创建了内存块(属于子进程地址空间),其中包含环境变量(作为键=值对)。
由于环境块属于您的流程,您可以根据需要更改自己的环境。但是,您的进程不可能更改父级的环境内存块(或任何其他进程)。可能实现这一目标的唯一方法是使用IPC(进程间通信)并轻轻地要求父进程内部执行此任务,但父进程必须主动侦听(在本地或网络套接字上)并愿意满足此类请求来自某人,与这方面的任何其他过程相比,儿童没有任何特殊之处。
这也是为什么你可以使用一些shell脚本改变bash环境的原因,但只能使用source
或.
bash宏 - 因为它由bash本身处理,而不启动任何外部进程。< / p>
但是,由于上述原因,您无法通过执行任何其他程序或脚本来更改环境。
答案 1 :(得分:1)
常见的解决方案是让您的应用程序将结果打印到标准输出,然后让调用者将其传递给其环境。教科书示例是ssh-agent
,它打印环境变量分配;您通常使用eval $(ssh-agent)