`
被触发
  • 浏览: 34892 次
文章分类
社区版块
存档分类
最新评论

如何让软件支持扩展功能

 
阅读更多
作为程序员的我们,必须保证灵活的设计,才能够应付变化的需求。但是,当把二进制程序发布给用户以后,用户有了新的需求,如果只能由开发者对程序进行修改,无疑是低效率的。而且有的时候,某些用户的需求,应用并不广泛,开发者不可能为一个用户添加该功能。这时候,如果该程序可以支持用户自定义的扩展功能,无疑是对用户是一大福音。

那么,如何让我们的程序支持用户自定义的扩展功能呢?恩~~,还是从Linux的宝库里面寻找吧。今天选择两个学习对象:1. iptables;2. tc

iptables的扩展实现:为了实现新的扩展,需要在iptables的源代码目录下的extensions目录添加新的功能的代码。iptables的扩展功能框架非常清晰,只需要按照iptables的match结构xtables_match和target结构xtables_target的定义,实现相应的功能即可。具体的参见http://blog.chinaunix.net/uid-23069658-id-3230608.html这篇文章。(该文章的iptable版本较低,数据结构与最近版本的iptables完全不一致)话说,我之前对于iptable的扩展是一窍不通。后来通过该文章知道了如何扩展iptables。几天的时间,就实现了多个iptables的扩展功能——包括用户态和内核态的代码。由此可见,iptables的扩展架构多么友好。但是这里也有个小问题。这样的扩展方式,需要重新编译iptables的代码,生成新的iptable二进制文件。这与我们心目中理想的扩展还差了一小步,稍微有点难以接受。试想,现在的浏览器大都支持扩展插件,有哪个插件需要重新编译浏览器的?

我们C语言程序员也可以实现这样的功能!让我们学习一下tc的扩展吧。以tc中的filer为例。tc的用户(必须也是程序员呵),可以实现自己的filter的实现,并将生成的so库文件放置在tc的库目录下。那么该扩展功能既可以被tc支持。同时,还要编写一个tc的内核实现模块并加载。这样,新的功能,在不重新编译tc,不重启机器的情况下,就得以支持了。这样就很类似浏览器插件的功能了吧:)也是我们期待的结构。

下面看看tc是如何做到这点的,最直接的方法就是查看tc的代码。
查看函数tc_filter_modify的部分代码:

strncpy(k, *argv, sizeof(k)-1);

q = get_filter_kind(k);
argc--; argv++;
tc从命令行参数argv中得到filter的类型并存到k中。接下来通过函数get_filter_kinde得到该类型filter的所有操作函数,主要是parse函数。

接下来进入关键的get_filter_kind的函数:

struct filter_util *get_filter_kind(const char *str)
{
    void *dlh;
    char buf[256];
    struct filter_util *q;

     /* 这里去遍历已知的filter列表,通过名字查找对应的filter类型 */
    for (q = filter_list; q; q = q->next)
        if (strcmp(q->id, str) == 0)
            return q;

     /*
     这部分代码是tc支持自定义扩展的关键代码
     没有找到,那么就去tc目录下加载对应名字的动态库
     */
    snprintf(buf, sizeof(buf), "%s/f_%s.so", get_tc_lib(), str);
    dlh = dlopen(buf, RTLD_LAZY);
    if (dlh == NULL) {
        /*
        如果打开该动态库失败,那么就直接去主程序中寻找。
        这样的情况一般是对于tc自身已支持的filter类型。
        */
        dlh = BODY;
        if (dlh == NULL) {
            dlh = BODY = dlopen(NULL, RTLD_LAZY);
            if (dlh == NULL)
                goto noexist;
        }
    }

     /*
     打开动态库后,再根据filter的类型名找到对应的name_filter_util符号
     该符号实际上即为tc的扩展接口,其为一个结构体,定义了filter的操作函数。
     得到该符号后,tc的用户态部分就已经可以支持新的扩展功能了。
     */
    snprintf(buf, sizeof(buf), "%s_filter_util", str);
    q = dlsym(dlh, buf);
    if (q == NULL)
        goto noexist;

reg:
    q->next = filter_list;
    filter_list = q;
    return q;
noexist:
    q = malloc(sizeof(*q));
    if (q) {
        memset(q, 0, sizeof(*q));
        strncpy(q->id, str, 15);
        q->parse_fopt = parse_nofopt;
        q->print_fopt = print_nofopt;
        goto reg;
    }
    return q;
}
在上面的代码中,我已经通过注释的方式,解释了tc如何支持扩展的filter类型。

对比iptables和tc的支持扩展的形式,无疑tc更胜一筹,因为无需重新编译iptables就可以支持新的扩展。这都是依赖于dlopen和dlsym来实现的,在我们自己的项目中,也可以采取同样的方式来支持用户自定义的扩展功能。
分享到:
评论

相关推荐

    应用程序支持扩展之鼠标手势

    程序支持扩展已不是新鲜事情,稍微有点名气的软件貌似都支持,关于为什么要支持扩展,及实现方式网上相关资料已很多, 现在不再赘述,但以后我回讲够的,甚至会把你讲烦为止,最终目标是让你的程序通过COM(ATL实现)...

    彩虹工具网程序开源未加密版源码-支持插件扩展 支持暗黑模式

    2023全新UI彩虹站长在线工具箱系统源码下载 全开源版本 支持暗黑模式 支持高达72种站长工具、开发工具、娱乐工具等功能。本地调用API、自带免费API...是一个多功能性工具程序支持后台管理、上传插件、添加增减删功能。

    优化、扩展USBEE逻辑分析仪自带红外解码功能,支持多钟红外协议自动识别

    优化、扩展USBEE逻辑分析仪自带红外解码功能,支持多钟红外协议自动识别。原自带红外解码只支持NECIR格式,并且时序比较严格导致解码不了。现优化时序,并且加入红外格式自动识别,目前只支持NECIR、RC5(2位地址位,...

    人力资源管理软件(完全免费)

    人力资源管理软件支持照片的打印(照片对象标识 emp_pict,类型为图片)(感谢Lucky Cat) 员工编辑和管理体现工龄和年龄(打印标识对应age、work_age、work_age_c)(感谢hui~星辉~) 一个岗位允许对应多个部门...

    有客宝快捷回复软件 v1.0.zip

    软件支持PC端、Android端和iOS端,支持QQ、YY、旺旺、千牛、京咚、飞信、微信、易信、钉钉等各种常见IM软件、不仅实现了客服的快捷回复功能,而且根据客服工作的需要,扩展了密码功能、表情功能、网址收藏功能和助手...

    有客宝快捷回复软件

    软件支持常见IM软件的基本情,真正实现了一站式的表情管理和发送,各种软件表情相互发送! 3、网址功能 软件支持自定义网址收藏,网址支持不同的浏览器打开,使用更加方便! 4、密码功能 有客宝扩展改进密码...

    Python-pytest框架可以轻松编写小型测试但可以扩展以支持复杂的功能测试

    pytest - 框架可以轻松编写小型测试,但可以扩展以支持复杂的功能测试

    答题卡制作软件 答卷设计软件SheetDesign

    5、通过本软件,可以让你在短时间内设计出自己考试科目的答题卡,需要的朋友可以到河东下载 答卷设计软件(SheetDesign)特色 1、答卷设计软件(SheetDesign)使用简单,可以直接运行在Word软件上使用 2、软件提供...

    免费的共享软件注册功能开发包

    官方网站( http://www.miogo.com/dev/ )提供的扩展功能,可供作者将开发出的共享软件在其官方网上登录,由网站全过程负责收费和发放注册码,帮助开发者节约大批量出售和发放注册码的额外工作,轻松地批量收取注册费...

    进销存软件 库存系统

    本进销存软件支持单机、网络,可以通过互联网安全接入企业内网,无需域名或固定IP 本进销存软件可定义业务流程,适应性强,为企业变化和发展提供支持 本进销存软件支持行业特性,适应性强,可对如制衣、鞋类、食品...

    禅道安装包,内置多语言支持,多风格支持,搜索功能,统计功能等实用功能

    (ZenTao) 是第一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就...

    人力资源管理软件绿色免费免安装版

    人力资源管理软件功能介绍 本人力资源软件包含人事档案管理 本人力资源软件包含工资管理(单机免费) 本人力资源软件包含考勤管理(单机免费) 本人力资源软件包含绩效管理 本人力资源软件包含用户管理(单机免费) ...

    C语言中无符号扩展和带符号扩展知识讲解.doc

    尽管C语言提供了许多低级处理的功能,但仍然保持着跨平台的特性,以一个标准规格写出的C语言程序可在包括类似嵌入式处理器以及超级计算机等作业平台的许多计算机平台上进行编译。 C语言是一门面向过程的计算机编程...

    ChatGPT公众号版源码无需授权、扩展、支持AI绘画

    ChatGPT公众号版源码破解授权、扩展、支持AI绘画。该产品支持用户付费套餐,多 Key 轮询,AI 绘画等功能,并且可以免费使用,同时附带详细的教程文档。 这款产品采用了最新的 ChatGPT 技术,可以生成、重写和汇总...

    让文件擦除不留痕的软件

    支持系统外壳扩展,您可以随时随地调用 本软件 擦除所需的内容。程序支持最高的 Gutmann 算法 35 次擦除,同时还内建了两种符合美国国防部 US DoD 5220.22-M 标准的擦除算法,可以彻底防止软件和硬件恢复工具的恢复 ...

    使用QtWidget界面库增加新的控件或在现有控件的基础上扩展控件功能.rar

    Qt-UI界面工具库是武汉维仕杰科技有限公司基于...采用Qt-UI界面开发工具将使企业大幅提高生产力且降低开发成本,节省界面设计和开发的工作,让开发工程师将更多的精力投入在软件功能的开发中,从而增强企业的创新能力。

    天喜抽奖软件 v3.2.12.zip

    软件能够帮助用户进行多功能的抽奖,它可支持自定义显示标题、奖项、中奖人等信息。支持多种抽奖方式,广泛运用于年会、庆典、生日、婚礼等活动,还具有可指定抽奖范围、抽奖名单不重复等功能。支持用户录入详细的...

    该软件包含压缩器、扩展器和每个波段的限幅器。还有许多其他有用的功能,如交叉淡出检测,差距杀手,体积标准化网络集成

    解压密码:123 ||该软件包含压缩器、扩展器和每个波段的限幅器。还有许多其他有用的功能,如交叉淡出检测,差距杀手,体积标准化网络集成。你的站点网站可以有一个专业的外观,它的Web小部件很容易使用。然后你可以...

    TomatoIDC开源虚拟主机销售系统源码具备易于扩展的插件系统,模版系统扩展虚拟主机销售业务.zip

    易于使用,界面清新可视化管理界面可扩展,支持(支付,服务器,功能)插件,支持多种模版功能强大,支持卡密充值,支持多种支付方式,支持接入微信公众号(账户绑定,查询余额)人性化,Gravatar头像,微信公众号...

    数科OFD文档处理软件.zip

    数科OFD阅读软件是一款基于我国自主OFD标准的版式阅读软件产品,不仅支持OFD/PDF电子文件的阅读浏览、文档操作、图文注释等通用版式处理功能,还根据公务办公特点,提供原笔迹签批、电子印章、语义应用、修订标记等...

Global site tag (gtag.js) - Google Analytics