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内核扩展的错误代码含义是啥?的主要内容,如果未能解决你的问题,请参考以下文章

GLSL 错误:2001 - 此错误代码是啥意思?

错误代码:400指的是啥错误?

Runtime Error是啥意思?

许多内核上令人尴尬的并行工作扩展性差

Assert.assertEquals是啥含义

此错误消息在 gsutil 中的含义是啥