mac内核扩展的错误代码含义是啥?
Posted
技术标签:
【中文标题】mac内核扩展的错误代码含义是啥?【英文标题】:What dose the error code meaning of mac kernel-extension?mac内核扩展的错误代码含义是什么? 【发布时间】:2017-12-27 13:27:26 【问题描述】:我在 mac 上编写了一个关于 tun 的内核扩展,我使用 API proto_register_plumber
如下:
err = proto_register_plumber(PF_INET, IFNET_FAMILY_TUN, method_attach, method_detach);
if (err)
printf("error code is : %d\n", err);
在一台mac(10.13)上,它返回17,这是什么意思?我该如何解决?
我在https://developer.apple.com/documentation/kernel/1532491-proto_register_plumber?language=objc 上阅读了有关 API 文档的信息,但我没有发现任何有关错误代码含义的信息。
【问题讨论】:
【参考方案1】:17
几乎可以肯定是errno
,尤其是因为它来自 KPI 的 BSD 部分。如果你查看errno.h你会发现它对应于EEXIST
:
#define EEXIST 17 /* File exists */
在您的 API 调用上下文中,这可能意味着已经为您尝试注册的东西注册了一些东西。我不熟悉 proto_register_plumber()
函数,但快速查看 its source code 会发现函数开头附近有以下检查,这似乎证实了我的怀疑:
lck_mtx_lock(proto_family_mutex);
TAILQ_FOREACH(proto_family, &proto_family_head, proto_fam_next)
if (proto_family->proto_family == protocol_family &&
proto_family->if_family == interface_family)
lck_mtx_unlock(proto_family_mutex);
return (EEXIST);
会不会是这样的:
您之前注册了处理程序,卸载了未取消注册的 kext,然后您重新加载了您的 kext,试图再次注册?在这种情况下,重新启动(并修复您的 kext 停止功能!)应该可以修复它。 另一个加载的 kext 已经注册了自己的处理程序?如果是这样,请尝试卸载可能的候选人。 xnu 内核已经为此协议族提供了默认处理程序?也许你需要以不同的方式去做你想做的事情。【讨论】:
坦克,这是因为另一个 kext 注册了它的处理程序!以上是关于mac内核扩展的错误代码含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章