如何在非当前进程的子进程中运行命令?

如何在非当前进程的子进程中运行命令?

我在从解释编程环境 (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,以便子进程使用正确的库。

相关内容