如何使用execl(";/usr/bin/open";)在macOS中重新启动当前程序?
我可以使用成功启动应用程序如何使用execl(";/usr/bin/open";)在macOS中重新启动当前程序?,c,objective-c,macos,exec,C,Objective C,Macos,Exec,我可以使用成功启动应用程序 execl(“/usr/bin/open”、“open”、“Applications/Foo.app”、“0”) 但当我在Foo.app中调用它时,这不起作用 我希望我的应用程序在崩溃和自动更新时重新启动 谢谢 open不会启动应用程序的第二个实例。如果应用程序已经在运行,它只会使其成为活动应用程序 通过执行应用程序包的可执行文件,您可以启动应用程序的第二个实例: excel("/Applications/Foo.app/Contents/MacOS/Foo", ..
execl(“/usr/bin/open”、“open”、“Applications/Foo.app”、“0”)代码>
但当我在Foo.app中调用它时,这不起作用
我希望我的应用程序在崩溃和自动更新时重新启动
谢谢 open
不会启动应用程序的第二个实例。如果应用程序已经在运行,它只会使其成为活动应用程序
通过执行应用程序包的可执行文件,您可以启动应用程序的第二个实例:
excel("/Applications/Foo.app/Contents/MacOS/Foo", ...
虽然这不是推出Cocoa应用程序的推荐方式,但苹果的工程师向我保证,这会奏效。但是请注意,您现在有两个应用程序实例正在运行,共享相同的NSUserDefaults
和其他资源,因此可能会出现一些奇怪的行为(或者通过exit()
立即终止第一个应用程序)
话虽如此,这可能不是你想要做的
首先,你不能“检测崩溃并采取一些行动”,因为根据定义,你的应用程序已经崩溃。有一些软件包可以检测崩溃并记录相关信息;寻找这样的解决方案来重新启动你的应用程序
至于更新,我会再次引导您使用第三方解决方案,如。它处理退出旧应用程序、替换旧应用程序,然后以理智的方式启动新应用程序
最后,您可以使用launchd
将您的应用程序注册为“用户代理”,这样,如果退出,它会自动重新启动。当程序崩溃时,您的程序如何处理?你在处理程序中捕捉到信号了吗?“自动更新”是什么意思?你怎么知道你的程序在/Applications/Foo.app
中,而不是用户选择的/somepath/Foo.app
?@EricPostpischil是的,我正在捕捉信号。我的应用程序必须在/应用程序中,已强制执行。非常感谢James。是的,我在execl()之后立即调用exit()。另外,使用“open-n”怎么样?open-n
也可以,但是执行open
来执行另一个应用程序似乎是不必要的复杂性。