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