【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

不知道大家留意过没有,很多软件本身都配置了丰富的插件软件。这些插件可以在软件之外提供更细致化、个性化的功能,满足开发者的需要。而软件本身更多的是满足一种基本的软件功能。比如说notepad++、firefox、eclipse、lighttpd、nginx等等,都提供了很多不同、但是很有特色的软件功能,十分有意思。

那么,一般来说,插件有什么特点呢?

1、插件可以提供特色功能

这是插件最大的特色,也是插件本身存在的意义。作为一个软件开发者,他写的软件功能再多,也没有办法满足所有人的需求,而插件可以帮助我们做到这一点。

2、插件一般都用dll或者so动态库的方法实现

插件和动态库似乎有天然的匹配性。动态库可以用dlopen、dlclose的方法被软件加载和卸载,使用十分方便。

3、插件可以随时被卸载,作为动态补丁和升级软件十分方便

比如说,作为游戏服务器而言,如果一个游戏需要升级或者有bug需要处理,那么就可以把这个游戏单独写成插件的形式。有问题的话,把这个插件单独卸载就可以了,完全不会影响其他程序的正常运行。

4、插件的结构不复杂,主要依赖软件的回调为主

插件的功能不复杂,一般包括init、notify、exit三个部分。其中init函数为模块初始化,告诉系统你能做什么。notify就是处理系统给出的命令请求,exit则是插件卸载时需要做的一些规定动作。

5、插件的实例流程

我觉得云风在skynet上面的module的处理程序写的挺好的,大家可以多借鉴借鉴,

地址在这,内容如下所示

#include "skynet.h"#include "skynet_module.h"
#include "spinlock.h"#include <assert.h>
#include <string.h>
#include <dlfcn.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdio.h>#define MAX_MODULE_TYPE 32struct modules {int count;struct spinlock lock;const char * path;struct skynet_module m[MAX_MODULE_TYPE];
};static struct modules * M = NULL;static void *
_try_open(struct modules *m, const char * name) {const char *l;const char * path = m->path;size_t path_size = strlen(path);size_t name_size = strlen(name);int sz = path_size + name_size;//search pathvoid * dl = NULL;char tmp[sz];do{memset(tmp,0,sz);while (*path == ';') path++;if (*path == '\0') break;l = strchr(path, ';');if (l == NULL) l = path + strlen(path);int len = l - path;int i;for (i=0;path[i]!='?' && i < len ;i++) {tmp[i] = path[i];}memcpy(tmp+i,name,name_size);if (path[i] == '?') {strncpy(tmp+i+name_size,path+i+1,len - i - 1);} else {fprintf(stderr,"Invalid C service path\n");exit(1);}dl = dlopen(tmp, RTLD_NOW | RTLD_GLOBAL);path = l;}while(dl == NULL);if (dl == NULL) {fprintf(stderr, "try open %s failed : %s\n",name,dlerror());}return dl;
}static struct skynet_module *
_query(const char * name) {int i;for (i=0;i<M->count;i++) {if (strcmp(M->m[i].name,name)==0) {return &M->m[i];}}return NULL;
}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;
}struct skynet_module *
skynet_module_query(const char * name) {struct skynet_module * result = _query(name);if (result)return result;SPIN_LOCK(M)result = _query(name); // double checkif (result == NULL && M->count < MAX_MODULE_TYPE) {int index = M->count;void * dl = _try_open(M,name);if (dl) {M->m[index].name = name;M->m[index].module = dl;if (open_sym(&M->m[index]) == 0) {M->m[index].name = skynet_strdup(name);M->count ++;result = &M->m[index];}}}SPIN_UNLOCK(M)return result;
}void
skynet_module_insert(struct skynet_module *mod) {SPIN_LOCK(M)struct skynet_module * m = _query(mod->name);assert(m == NULL && M->count < MAX_MODULE_TYPE);int index = M->count;M->m[index] = *mod;++M->count;SPIN_UNLOCK(M)
}void *
skynet_module_instance_create(struct skynet_module *m) {if (m->create) {return m->create();} else {return (void *)(intptr_t)(~0);}
}int
skynet_module_instance_init(struct skynet_module *m, void * inst, struct skynet_context *ctx, const char * parm) {return m->init(inst, ctx, parm);
}void
skynet_module_instance_release(struct skynet_module *m, void *inst) {if (m->release) {m->release(inst);}
}void
skynet_module_instance_signal(struct skynet_module *m, void *inst, int signal) {if (m->signal) {m->signal(inst, signal);}
}void
skynet_module_init(const char *path) {struct modules *m = skynet_malloc(sizeof(*m));m->count = 0;m->path = skynet_strdup(path);SPIN_INIT(m)M = m;
}

随想录(插件的重要思想)相关推荐

  1. C\S结构的插件式开发思想以及向B\S结构的架构延伸(二)

    忙碌的好多天过去了,自从上一贴发出后,不少同仁都对插件式开发提出了自己的看法以及分享一些插件式开发比较典型的例子,感谢李锋.肖明等 同仁的分享,也感谢所有顶贴的同志,今天来分享一下插件式开发著名的产品 ...

  2. java封装插件,基于面向对象思想封装一个水球插件

    1 2 3 4 5 test 6 7 body{ 8 display:flex; 9 flex-flow:column wrap; 10 justify-content:center; 11 alig ...

  3. 京东运营插件_技术中台产品经理必知的那些易混词儿(1):组件、套件、 中间件、插件……...

    编辑导语:在产品经理做技术中台时,有很多需要知道的专有名词概念:比如:组件.套件.中间件.插件等等,本文作者对此进行了解释和梳理,便于产品经理可以快速理解技术中台产品的逻辑和思维,我们一起来看一下. ...

  4. java类加载器 架构 设计_类加载器(DexClassLoader)与插件化(动态加载)

    类加载器与插件化解析 2.1 类装载器 DexClassLoader 首先,我们需要了解关于java代码本地import的一些知识: import中所引用的类有两个特点: 1.必须存在于本地,当程序运 ...

  5. Android插件化开发之动态加载三个关键问题详解

    本文摘选自任玉刚著<Android开发艺术探索>,介绍了Android插件化技术的原理和三个关键问题,并给出了作者自己发起的开源插件化框架. 动态加载技术(也叫插件化技术)在技术驱动型的公 ...

  6. iOS 上的插件化设计

    ????????关注后回复 "进群" ,拉你进程序员交流群???????? 转自:掘金 ZenonHuang https://juejin.cn/post/697962703724 ...

  7. Android 插件化学习

    突然想到Android 的插件化开发,于是网上搜罗资料,初步认知demo如下:  主要思想:利用 类加载器ClassLoader实现. 解决主要问题:一个是65K 大小问题,另外可以动态加载apk实现 ...

  8. 插件体系结构软件开发方法研究

    插件体系结构软件开发方法研究 计算机软件与理论专业 研究生 一觉亮天 随着计算机技术的发展,软件体系结构和开发方法也在发生着重大变化.为了高效率地进行软件开发,并且开发出高质量的产品,人们一直在寻求更 ...

  9. 8、多设备和异构插件

    多设备和异构插件 多设备插件 指定使用哪些设备 代码实例 异构插件 配置异构插件 代码实例 两个对比 多设备插件 多设备插件会在运行时检查当前各个计算设备的利用率,然后决定应该把哪个推理计算请求放到哪 ...

最新文章

  1. 如何在C#Windows控制台应用程序中更新当前行?
  2. python隐式调用方法_Python为什么不隐式实现self
  3. 一文带你认识Spring事务
  4. java执行Linux shell命令或者Window cmd命令
  5. asp.net core添加全局异常处理及log4net、Nlog应用
  6. 字符串转数字测试--知识备忘
  7. 实现ABP中Person类的权限功能
  8. linux的文件系统架构
  9. 中科曙光:与VMware合资公司是技术公司
  10. php改变图片类型,php 图片处理函数 获取类型 扩展名
  11. Python+OpenGL实现Liang-Barsky算法裁剪直线
  12. java 对象的强制类型转换
  13. 所有类型的基类Object,所有类型的基类Type
  14. etl调度工具 Taskctl 变量概述
  15. 孙溟㠭篆刻作品《叶》
  16. python中global和def_Python中 Global和Nonlocal的用法详解
  17. ES2016/ES2017/ES2018/ES2019 新语法
  18. linux磁盘变为raw,磁盘变成RAW格式的两种解决办法
  19. 浅析android手游lua脚本的加密与解密
  20. 感受生命的伟大,努力绽放生命!

热门文章

  1. 使用Elasticsearch,Kafka和Cassandra构建流式数据中心
  2. 图论--有向图强连通分量的标记及缩点模板
  3. Emgucv中快捷的显示图像直方图
  4. 让电脑替你说:"I IOVE YOU"
  5. VS2010给Activex添加接口
  6. python爬虫播放mp3
  7. mongoDb 给表添加+ 删除字段
  8. 新建jsp报错“The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path”...
  9. android之Handler Runnable实现倒计时
  10. Castle ActiveRecord学习笔记四:各种映射