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


3

我在解释性编程环境(IDL)中调用外部程序时遇到库冲突问题。问题似乎是因为我调用的程序最终成为IDL的子代,所以库不会被重新加载。

在IDL中,我可以直接或使用shell启动子流程。有没有一种好的方法可以让我的程序在不作为子进程结束的情况下运行?

到目前为止我找到的唯一解决方案是使用ssh localhost my_program。这很好用,但我想要一个更直接的解决方案。


实际上,您能否更详细地解释为什么以及如何 “不是儿童过程”?
grawity 2011年

1
我的具体问题与OS X上的动态库的冲突版本有关.IDL使用旧版本的libcurl.dylib,而我在IDL中调用的程序需要此库的较新版本。我不明白在OS X上如何处理动态库,但在我看来,一旦加载旧库,所有子进程都使用相同的库。在不同的终端中运行我的程序,或使用ssh连接在IDL中运行我的程序时,我没有库问题。
amicitas 2011年

创建一个不是当前进程子进程的进程似乎应该可以解决我的问题。我现在很好奇如何做到这一点。我本以为这是一件相当容易的事情,但似乎找不到办法。所以我的问题仍然是在当前流程树之外启动流程,而不是解决我的问题。
amicitas 2011年

Answers:


3

IDE可以加载一组不同的动态库,因为您的应用程序继承了一个不同的环境,然后动态链接器使用该环境来查找库。有关可能影响动态链接器行为的环境变量,请参阅dyld联机帮助页。您的IDE应该有控制它的选项。

如果您仍想确保您的应用程序是从没有IDE作为祖先的进程运行的,那么您可以将IDE配置为运行如下命令:

bash -c 'your_app &'

这将使bash在后台运行your_app并退出。当父进程(此处为:bash)退出时,init进程采用子进程(此处为:your_app),这意味着init(PID = 1)成为其父进程。但是,这不会对加载的库产生影响。

您还可以运行等待信号的服务器脚本(使用陷阱命令)并在收到它时执行您的应用程序。然后应将IDE配置为运行kill命令以将信号发送到服务器。这样,您将在与终端相同的环境中运行应用程序。这可能是一个矫枉过正的解决方案。

我的建议是尝试配置IDE,以便子进程使用正确的库。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.