【问题标题】:Launching an application from another process从另一个进程启动应用程序
【发布时间】:2012-04-07 18:37:32
【问题描述】:

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

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

谢谢

【问题讨论】:

  • 如果它没有赏金,我会投票关闭它。你的问题很模糊——我们怎么知道哪一个更适合你?您没有提供 任何 信息来说明您的要求以及您提到的 3 项中的任何一项存在问题的原因。

标签: macos launching-application


【解决方案1】:

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

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 但是哪种方式最适合我们?应该注意什么?
    【解决方案3】:

    来自NSWorkspaces 上的 OSX 文档:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 1970-01-01
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多