0

是否可以从终端运行 c++ 应用程序并在某些条件下将命令返回到调用它的终端?例如,如果我要在我的终端中并在我的选择之后运行一个应用程序;我的应用程序需要通过运行导出命令来更改我的 PATH,例如:

(使用 BASH)

export PATH=.:/home/User/application/bin:$PATH

完成后,在我的应用程序完全关闭之前,我可以让应用程序使用上述命令更改我的终端本地环境变量吗?Qt 是否提供了这样做的方法?提前感谢您的帮助!

4

2 回答 2

1

不,您不能更改父应用程序环境。

为什么?当您的父应用程序启动您的应用程序时(可能使用system()),它实际上是fork()ed - 子进程诞生为几乎完全复制父进程,然后该子进程使用execve()调用,它将该进程的可执行映像完全替换为您的应用程序的可执行映像(对于脚本,它将是解释器(如 bash)的图像)。

除此之外,这个过程还准备了更多的东西。一个是打开文件的列表,从文件句柄 0、1、2(stdin、stdout、stderr)开始。此外,它创建了包含环境变量(作为键=值对)的内存块(属于子进程地址空间)。

因为环境块属于你的进程,你可以随意改变你自己的环境。但是,您的进程不可能更改父进程(或任何其他进程)的环境内存块。可能实现这一点的唯一方法是使用 IPC(进程间通信)并温和地要求父级在其中执行此任务,但父级必须积极监听(在本地或网络套接字上)并愿意满足此类请求来自某人,并且在这方面与任何其他过程相比,孩子并没有什么特别之处。

这也是为什么您可以使用一些 shell 脚本更改 bash 环境的原因,但只能使用sourceor .bash 宏 - 因为它是由 bash 本身处理的,而不启动任何外部进程。

但是,由于上述原因,您不能通过执行任何其他程序或脚本来更改环境。

于 2012-11-15T05:44:50.387 回答
1

常见的解决方案是让您的应用程序将结果打印到标准输出,然后让调用者将其传递给它的环境。一个教科书示例是ssh-agent打印环境变量分配;你通常调用它eval $(ssh-agent)

于 2012-11-15T06:04:15.500 回答