3

我们有一个以捆绑包形式构建的应用程序,我们希望从另一个进程启动它。

我们应该怎么做?据我了解,我们可以使用 openUrls()、openFile() 或 execve(),但我不知道哪个更适合我们。

谢谢

4

3 回答 3

1

由于您在谈论应用程序,因此您不想通过文件关联机制。它们用于使用适当的应用程序打开文档、图像等。由于您似乎不确定要问什么,我想说保持简单:

exec*系列直接启动可执行文件。但请注意,它用已启动的应用程序替换了启动过程。您的启动器将在此时停止执行。如果您希望启动器继续运行,您需要使用启动子进程的东西。低级方式fork/vfork之后是exec,但使用 启动您的应用程序要简单得多system,它会在幕后处理所有事情。(假设世界另一端的用户注入执行路径没有安全问题)。

如果启动器在启动您的应用程序后没有立即终止,您将需要考虑它是否“阻塞”直到启动的应用程序终止,或者它是否异步启动应用程序 - 以便它们随后并行运行。启动器也可能“等待”应用程序的返回值,以检查它是否成功,然后可能会做一些事情。有很多方法可以做到这一点,但是由于我们不知道您需要什么,所以我不会详细说明。

简而言之:如果您的启动器的唯一工作是启动您的应用程序,请使用execl. 如果您的启动器需要执行更多操作,请使用system. 如果两者都不完全符合您的需求,您需要提供更多信息——从编写启动器的语言开始。

PS。两者都具有通用性和可移植性的优点。它们适用于 GUI 和命令行应用程序,它们适用于任何类 Unix 系统,在某种程度上适用于 Windows。没有必要为了这么简单的事情把自己锁在 Cocoa 中。

于 2012-04-07T10:27:08.000 回答
0

如果您使用的是 Cocoa,则可以使用NSWorkspace's -launchApplication:

于 2012-03-31T21:45:12.157 回答
0

来自NSWorkspaces上的 OSX 文档:

  • openFile:打开使用与其类型关联的默认应用程序指定的指定文件。
  • openURL:打开指定 URL 的位置。

使用 url,您还可以在 ftp 或 http 上打开文件。

于 2012-04-06T05:30:51.883 回答