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