从另一个进程启动应用程序

时间:2012-03-14 19:12:44

标签: macos launching-application

我们有一个应用程序,我们已经构建为一个bundle,我们希望从另一个进程启动它。

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

由于

3 个答案:

答案 0 :(得分:1)

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

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

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

简而言之:如果您的启动器的唯一工作是启动您的应用,请使用execl。如果您的启动器需要执行更多操作,请使用system。如果两者都不能满足您的需求,您需要提供更多信息 - 从您的启动器编写的语言开始。

PS。这两者都具有通用性和便携性的优点。它们适用于GUI和命令行应用程序,它们可以在任何类Unix系统上运行,在某种程度上也适用于Windows。没有必要将自己锁定在Cocoa中以获得如此简单的东西。

答案 1 :(得分:0)

如果您使用的是Cocoa,则可以使用NSWorkspace的{​​{1}}。

答案 2 :(得分:0)

来自NSWorkspaces的OSX文档:

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

使用url,您也可以在ftp上打开文件,例如http。