mac内核扩展的错误代码含义是什么?

时间:2017-12-27 13:27:27

标签: macos kernel-extension

我编写了一个关于tun on mac的内核扩展,我使用了一个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 个答案:

答案 0 :(得分: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内核是否已为此协议系列提供默认处理程序?也许你需要以不同的方式去做你想要做的事情。