![如何在非当前进程的子进程中运行命令?](https://linux22.com/image/1292892/%E5%A6%82%E4%BD%95%E5%9C%A8%E9%9D%9E%E5%BD%93%E5%89%8D%E8%BF%9B%E7%A8%8B%E7%9A%84%E5%AD%90%E8%BF%9B%E7%A8%8B%E4%B8%AD%E8%BF%90%E8%A1%8C%E5%91%BD%E4%BB%A4%EF%BC%9F.png)
我在从解释编程环境 (IDL) 中调用外部程序时遇到了库冲突问题。问题似乎是,由于我调用的程序最终成为 IDL 的子程序,因此库不会被重新加载。
我可以直接或使用 shell 从 IDL 启动子进程。有没有一种好的方法可以让我的程序运行而不以子进程的形式结束?
到目前为止,我发现的唯一解决方案是使用ssh localhost my_program
。这非常有效,但我想要一个更直接的解决方案。
答案1
IDE 可能会加载一组不同的动态库,因为您的应用程序继承了不同的环境,然后动态链接器会使用该环境来查找库。请参阅dyld 手册页可能影响动态链接器行为的环境变量。您的 IDE 应该有选项来控制这一点。
如果您仍想确保您的应用程序从没有您的 IDE 作为祖先的进程运行,您可以配置 IDE 来运行如下命令:
bash -c 'your_app &'
这将使 bash 在后台运行 your_app 并退出。当父进程(此处为:bash)退出时,子进程(此处为:your_app)将被 init 进程收养,这意味着 init(PID=1)将成为其父进程。不过,这不会对加载的库产生影响。
您还可以运行一个服务器脚本,该脚本等待信号(使用 trap 命令)并在收到信号时执行您的应用程序。然后应配置您的 IDE 以运行 kill 命令以将信号发送到服务器。这样,您将在与终端相同的环境中运行您的应用程序。这可能是一个过度的解决方案。
我的建议是尝试配置 IDE,以便子进程使用正确的库。