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

问题描述 投票:0回答:1

我是一个关于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文档的内容,但我没有发现任何有关错误代码含义的内容。

macos kernel-extension
1个回答
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内核是否已为此协议系列提供默认处理程序?也许你需要以不同的方式去做你想要做的事情。
© www.soinside.com 2019 - 2024. All rights reserved.