我需要将“ 服务器类型 ”应用程序绑定到OS X 10.6及更高版本上的特权端口(<1024)。该应用程序通常由没有root特权的用户执行。
阅读了本网站上的许多主题后,我发现此选项是最新和最安全的方法:
1)编写一个助手应用程序以打开特权端口。
2)使用SMJobBless来“安装”要启动的助手应用程序。
3)从主应用程序(通过IPC)调用帮助程序应用程序以检索打开的特权端口。
从Apple文档:
因为launchd本身以root用户身份运行,所以如果您使用特权进程的唯一原因是在一个低编号的端口上运行守护程序,则可以让launchd代表守护程序打开该端口,并将open套接字传递给守护程序,因此,您无需以root用户身份运行代码。
我不是在运行守护程序,而只是在用户应用程序上运行,但适用相同的原则。
我已经找到了SMJobBless的代码示例,并阅读了Nathan de Vries的博客。(不能使用XPC-在OSX 10.6上不可用)。
我很清楚SMJobBless /启动的编码。
我的问题: 请指向代码示例,该示例演示如何在另一个应用程序(即帮助程序)中打开端口并将端口句柄(CFSocketRef?)传递回主应用程序。也许有人可以给我指出一个通过SMJobBless实现此功能的代码示例。
非常感谢
我有一个可以在Snow Leopard服务器上运行数天和数周的应用程序。它用于-[NSRunLoop runUntilDate:]“暂停”十秒钟,执行其任务,然后再次暂停。运行一个多小时后,我的应用程序崩溃并显示以下报告:
崩溃报告
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000013
Crashed Thread: 0 Dispatch queue: com.apple.main-thread
Application Specific Information:
objc_msgSend() selector name: release
Thread 0 Crashed: Dispatch queue: com.apple.main-thread
0 libobjc.A.dylib 0x00007fff84cfef0c objc_msgSend + 40
1 com.apple.CoreFoundation 0x00007fff84e363d1 __CFRunLoopDoSources0 + 1361
2 com.apple.CoreFoundation 0x00007fff84e345c9 __CFRunLoopRun + 873
3 com.apple.CoreFoundation 0x00007fff84e33d8f CFRunLoopRunSpecific + 575
4 com.apple.Foundation 0x00007fff83e73b74 -[NSRunLoop(NSRunLoop) runMode:beforeDate:] + 270
5 com.apple.Foundation 0x00007fff83ebf19a -[NSRunLoop(NSRunLoop) runUntilDate:] + 78
Run Code Online (Sandbox Code Playgroud)
乍一看,我以为我的NSRunLoop对象不再有效,因此releaseCF中深处的消息会导致崩溃。但是,我认为情况并非如此,因为我之前获得了对currentRunLoop对象的引用。
崩溃时间在1到1.5小时之间变化,但是我无法确定是什么原因造成的。由于我不确定下一步该怎么做,因此将不胜感激任何评论或意见或调试想法。 …