- 关键代码如下:
static void *
get_api(struct skynet_module *mod, const char *api_name) {
size_t name_size = strlen(mod->name);
size_t api_size = strlen(api_name);
char tmp[name_size + api_size + 1];
memcpy(tmp, mod->name, name_size);
memcpy(tmp+name_size, api_name, api_size+1);
char *ptr = strrchr(tmp, '.');
if (ptr == NULL) {
ptr = tmp;
} else {
ptr = ptr + 1;
}
return dlsym(mod->module, ptr);
}
static int
open_sym(struct skynet_module *mod) {
mod->create = get_api(mod, "_create");
mod->init = get_api(mod, "_init");
mod->release = get_api(mod, "_release");
mod->signal = get_api(mod, "_signal");
return mod->init == NULL;
}
主要有四个函数:
<module>_create
创建回调,参考logger服务,其主要是申请空间,创建上下文:struct logger
<module>_release
释放回调,参考logger服务,其主要是释放空间,释放上下文:struct logger以及内部的空间
<module>_init
入口,相当于skynet.start的参数1的回调函数
<module>_signal
参考logger服务,其函数可以没有,暂时不知道啥作用
2.其函数指针通过dlsym获取,这个函数可以实现通过字符串名获取动态库的函数指针