根据 MythTV 后端的问题:
http://svn.mythtv.org/trac/ticket/7582
在 MacOS X 10.6.2 上运行 MythTV 后端时,它会崩溃:
BUG IN CLIENT OF LIBDISPATCH: Do not close random Unix descriptors
该消息似乎来自中央调度中心。
Exception Type: EXC_BAD_INSTRUCTION (SIGILL)
Exception Codes: 0x0000000000000001, 0x0000000000000000
Crashed Thread: 1 Dispatch queue: com.apple.libdispatch-manager
Application Specific Information:
BUG IN CLIENT OF LIBDISPATCH: Do not close random Unix descriptors
Thread 1 Crashed: Dispatch queue: com.apple.libdispatch-manager
0 libSystem.B.dylib 0x9481ea51 _dispatch_mgr_invoke + 804
1 libSystem.B.dylib 0x9481dcc3 _dispatch_queue_invoke + 163
2 libSystem.B.dylib 0x9481da68 _dispatch_worker_thread2 + 234
3 libSystem.B.dylib 0x9481d4f1 _pthread_wqthread + 390
4 libSystem.B.dylib 0x9481d336 start_wqthread + 30
由于 MythTV 中有关此问题的代码位于 main() 的早期,因此只能想象 Grand Central Dispatch 库的链接会自动导致某个后台线程运行,该线程会监视某些特殊文件描述符。问题是 MythTV 后端正在关闭从 3 开始的所有文件描述符,并且可能也会关闭这个特殊文件描述符。
问题是,是否有任何方法可以设置 MacOS X,使其不使用 Grand Central Dispatch,而使用在 MacOS X 10.5 下使用的任何程序,以尝试避免此问题,直到 MythTV 人员有心查看它并更改代码。
另外,有人能解释一下 Grand Central Dispatch 是否按照我推理使用了一些特殊的文件描述符吗?
答案1
该错误出现在 MythTV 中。命令行参数解析显然导致 GCD 作为副作用启动。解决方案很简单。将关闭所有描述符的“for ()”循环移至 main() 的最顶部。