沙盒 - 不允许 killall 操作
Posted
技术标签:
【中文标题】沙盒 - 不允许 killall 操作【英文标题】:Sandbox - killall Operation not permitted 【发布时间】:2012-05-29 23:48:15 【问题描述】:我正在编写一个运行以下命令的小型 Mac 应用程序(在 Obj-C 中):
system("killall Finder");
我想看看如果我将应用程序沙盒化(因为沙盒化将在 6 月 1 日开始),应用程序将无法运行,会发生什么情况。我收到以下回复:
killall: warning: kill -TERM 6524: Operation not permitted
有没有办法解决这个问题?是否以特定的权限添加或以其他方式运行命令?
提前致谢。
【问题讨论】:
有很多可以拒绝的;system(3)
函数、killall(1)
程序、发现comm
->pid
映射的内省例程,或杀死进程的signal(2)
系统调用。 看起来 signal(2)
调用被拒绝了,如果没有办法向沙箱外的进程发送信号,我不会感到震惊......你的目标是什么我>? (当然killall Finder
不是你申请的重点...... :)
@sarnold 那将是一个非常没用的应用程序:P。我正在尝试运行像defaults write com.apple.finder DesktopViewOptions -dict IconSize -integer 512
这样的简单命令。在这些之后,您需要killall Terminal
才能生效。
人力资源部。我认为这会让用户感到不安。很多。
哎呀...错字...我的意思是Finder
...抱歉。 :(
@sarnold 好吧,我打算在命令运行之前警告他们...
【参考方案1】:
您的应用完全违背了沙盒的精神,因此 MAS 的审阅者几乎不可能接受它。此外,您可能会惊讶于“defaults write com.apple.finder”在您的沙箱中所做的事情——基本上没有什么用处。您必须对 home-relative /Library/Preferences/com.apple.finder.plist 使用临时异常权利,使用一些不受沙盒影响的 API 来获取 home 路径(例如,getpwent()->pw_dir ),然后直接加载和保存 plist。然后你会发现没有办法从沙盒应用程序调用非子进程,期间,没有办法绕过它 - 如果你尝试系统 killall,它最终会和你在同一个沙盒中运行,因此具有相同的限制。
但是,您问了一个具体问题,即是否有办法解决该系统 killall 失败的问题,并且至少有三个(不包括沙盒中的漏洞,这些漏洞要么已被 10.7.4 堵塞,要么很快就会被堵塞) ):
您可以创建一个没有沙盒的帮助应用程序,它可以为您完成所有工作。仅有的两种 App Store 批准的方法是 XPC 和 SMLoginItemSetEnabled。并且在没有用户明确告诉您这样做的情况下,您不得启用帮助程序。
您可以向 Finder 发送 Apple 事件,要求其退出,而不是发出信号。最简单的方法是执行 Applescript '告诉应用程序“Finder”退出'。至少对于 10.7.3 和更早版本,您需要临时的异常权利才能将 Apple 事件发送到 com.apple.finder。 (未来的操作系统版本可能会有不同的机制,但没有人可以在 NDA 论坛之外讨论它们。)
您可以将 Apple 事件发送到其他进程(如系统事件)以代表您终止 Finder。
等等。
【讨论】:
没问题。您可能想尝试在 devforums.apple.com 上询问此问题(尤其是如果您拥有 Mac 开发人员计划会员资格并因此可以)查看 NDA 论坛,并且您还应该在 bugreport.apple.com 上提交雷达请求以寻求某种方式做你想做的事。你可能会被击落,但你永远不知道......而且从苹果那里听到肯定的“不”总是比基于其他开发者的猜测要好。 我不相信 XPC 或 SMLoginItemSetEnabled 会让你“创建一个没有沙盒的帮助应用程序”。我不确定这一点,但我相当肯定 Apple 不会允许捆绑非沙盒应用程序的应用程序。此外,Apple 通常会拒绝包含 com.apple.finder 或 com.apple.systemevents 权利的应用程序。 @AriX:您可以在沙盒中SMLoginItemSetEnabled
一个非沙盒应用程序,至少当我在 10.7 中对其进行测试时。但是,正如您所怀疑的,Apple 会拒绝您捆绑非沙盒应用程序。这就是答案的重点:有很多方法可以做到这一点,但所有这些都违背了沙盒的精神,并且很可能会让你被 App Store 拒绝。 (有些细节,比如第一段的最后一句话,有点过时了,但重点是一样的。)【参考方案2】:
如果你有充分的理由,你仍然可以像这样杀死应用程序: How can I terminate my app in a helper app with sanboxing enabled?
【讨论】:
以上是关于沙盒 - 不允许 killall 操作的主要内容,如果未能解决你的问题,请参考以下文章
2023-04-03 Linux中杀死进程kill和killall命令的区别,着重介绍killall
linux ubuntu kill指令和killall指令的区别(killall会终止所有与该名字匹配的进程)