我有一个使用
在终端中运行二进制可执行文件的应用程序NSString *systemRun = [[NSString alloc] init];
systemRun = [systemRun stringByAppendingFormat:@"open -a Terminal %@", executable];
system([systemRun UTF8String]);
现在,我想在我的GUI上放置一个“结束”按钮,这将关闭终端。但是,在我可以使用NSRunningApplication来终止它之前,我需要让终端会话注销,这样它就不会提示用户提示登录过程仍然在运行。我认为让窗口类型为“logout”和返回字符是最容易的。我知道我可以用AppleScript做到这一点,但AppleScript可以做一些Cocoa无法做到的事情似乎很奇怪。我错过了什么吗?
答案 0 :(得分:2)
<强> STOP!强>
如果用户可能已经在程序使用该应用程序的上下文之外使用它,那么永远不会告诉另一个应用程序退出。
如果您的用户已打开终端窗口并执行某些操作,那么当程序尝试终止Terminal.app时,您的程序将会干扰该程序。如果用户将Terminal.app配置为在关闭仅运行登录进程和shell的会话之前未提示,则最终将在没有警告的情况下终止所有用户的ssh会话。
(如果您的文字处理器告诉您的网络浏览器显示一个页面,然后当您关闭一个页面时杀死所有浏览器会话,您希望如何?)
至少,使用open -n -W -a
,但如果可能的话,根本不要使用终端,只需将可执行文件的stdout传输到NSTextView。如果您的可执行文件需要与用户进行交互,请考虑使用xterm
进程,该进程将在您的进程完成时自行终止。
答案 1 :(得分:0)
<强> GO!强>
你应该认为自己是计算机之神。不幸的是,恶意的人用酒吧包围着我们。 AppleScript不会向接收程序发送Objective-C消息。它发送收件人同意解释和执行的事件。
请参阅OSX分布式对象架构,使用NSDistantObject,NISInvocation,NSConnection,NSPortMessage,NSPort将消息从客户端进程传输到服务器进程。我还没有走过这条路。
请参阅Distributed Objects手册。