我们有一个以捆绑包形式构建的应用程序,我们希望从另一个进程启动它。
我们应该怎么做?据我了解,我们可以使用 openUrls()、openFile() 或 execve(),但我不知道哪个更适合我们。
谢谢
我们有一个以捆绑包形式构建的应用程序,我们希望从另一个进程启动它。
我们应该怎么做?据我了解,我们可以使用 openUrls()、openFile() 或 execve(),但我不知道哪个更适合我们。
谢谢
由于您在谈论应用程序,因此您不想通过文件关联机制。它们用于使用适当的应用程序打开文档、图像等。由于您似乎不确定要问什么,我想说保持简单:
该exec*
系列直接启动可执行文件。但请注意,它用已启动的应用程序替换了启动过程。您的启动器将在此时停止执行。如果您希望启动器继续运行,您需要使用启动子进程的东西。低级方式fork/vfork
之后是exec
,但使用 启动您的应用程序要简单得多system
,它会在幕后处理所有事情。(假设世界另一端的用户注入执行路径没有安全问题)。
如果启动器在启动您的应用程序后没有立即终止,您将需要考虑它是否“阻塞”直到启动的应用程序终止,或者它是否异步启动应用程序 - 以便它们随后并行运行。启动器也可能“等待”应用程序的返回值,以检查它是否成功,然后可能会做一些事情。有很多方法可以做到这一点,但是由于我们不知道您需要什么,所以我不会详细说明。
简而言之:如果您的启动器的唯一工作是启动您的应用程序,请使用execl
. 如果您的启动器需要执行更多操作,请使用system
. 如果两者都不完全符合您的需求,您需要提供更多信息——从编写启动器的语言开始。
PS。两者都具有通用性和可移植性的优点。它们适用于 GUI 和命令行应用程序,它们适用于任何类 Unix 系统,在某种程度上适用于 Windows。没有必要为了这么简单的事情把自己锁在 Cocoa 中。
如果您使用的是 Cocoa,则可以使用NSWorkspace
's -launchApplication:
。
来自NSWorkspaces上的 OSX 文档:
使用 url,您还可以在 ftp 或 http 上打开文件。