我编写了一个关于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文档的内容,但我没有发现错误代码的含义。
答案 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);
}
}
可能是那样: