如何从c++;应用到父终端? 是否可以从终端运行C++应用程序,在某些条件下将命令返回到从该终端调用的终端?例如,如果我要在我的终端内和选择之后运行应用程序;我的应用程序需要通过运行导出命令来更改路径,例如:

如何从c++;应用到父终端? 是否可以从终端运行C++应用程序,在某些条件下将命令返回到从该终端调用的终端?例如,如果我要在我的终端内和选择之后运行应用程序;我的应用程序需要通过运行导出命令来更改路径,例如:,c++,bash,qt,path,environment-variables,C++,Bash,Qt,Path,Environment Variables,(使用BASH) 完成后,在我的应用程序完全关闭之前,我可以让应用程序使用上述命令更改我的终端本地环境变量吗?Qt是否提供了这样做的方法?提前感谢您的帮助 否,您不能更改父应用程序环境 为什么??当您的父应用程序启动您的应用程序时(可能使用system()),它实际上是fork()ed-子进程几乎与父进程完全相同,然后该子进程使用execve()调用,将该进程的可执行映像完全替换为应用程序的可执行映像(对于脚本,它将是类似bash的解释器的图像) 除此之外,该进程还准备了其他一些东西。一个是打开

(使用BASH)


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

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

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

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

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

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


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

常见的解决方案是让您的应用程序将结果打印到标准输出,然后让调用程序将其传递到其环境。教科书中的一个示例是打印环境变量assignment的ssh代理用“<代码> EVAL(SSH代理)< /Calp>< /P>”来调用它,基本上是作为C++的标准通用方法,您可能希望使用<代码> Sype(),QT提供了
QProcess
类作为一个稍微高级的替代方案。感谢您的详细解释。我理解家长可以修改孩子,而不是反过来。但是对于像bash进程这样的带有接口的下划线,可以接受命令;我不能让我的应用程序通过几个测试吗命令返回到终端?抱歉,不,您不能。当子进程返回时,所有进程剩余部分完全消失。整个“返回”过程就是在长时间
waitpid()后,父进程最终获得控制权
关于child's process idI,我不想在这里打一匹死马,但请听我说。在审查之后,似乎可以向终端发送命令。比方说,我告诉我的应用程序制作一个包含要获取的导出代码的脚本文件,然后向终端发送一个源代码命令,以获取所创建的文件的源代码。你认为会这样吗工作..?如果调用方进程正在积极合作-当然可以(如果父进程从子进程读取标准输出或保存的文件,然后对其进行解释)。但它不会像通用方法那样工作。那么有没有办法让我的家长终端积极配合?也许有一些文档可以解释这个过程?换句话说,家长必须积极配合
export PATH=.:/home/User/application/bin:$PATH