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

如何让软件支持扩展功能

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

那么,如何让我们的程序支持用户自定义的扩展功能呢?恩~~,还是从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来实现的,在我们自己的项目中,也可以采取同样的方式来支持用户自定义的扩展功能。
分享到:
评论

相关推荐

    扩展功能一支持库

    在IT领域,扩展功能支持库通常指的是为了增强软件或操作系统的核心功能而开发的一系列外部组件或模块。这些库提供了额外的API(应用程序编程接口),使得开发者可以利用它们来实现更复杂的功能,或者优化已有功能的...

    工业机器人示教系统扩展功能与软件开发.pdf

    在研究工业机器人示教系统时,需要关注其扩展功能和软件开发的各个方面。首先,示教系统是工业机器人技术中一个十分重要的部分,它决定了机器人是否能够准确无误地完成特定的任务。工业机器人的示教方式主要有在线示...

    扩展界面一|扩展界面二|扩展界面三支持库

    总的来说,"扩展界面一"、"扩展界面二"和"扩展界面三支持库"是软件开发中提升用户界面灵活性和功能性的关键工具。它们不仅简化了开发过程,也帮助开发者创造出更强大、更个性化的用户体验。理解并熟练运用这些支持库...

    系统右键扩展功能小工具

    《系统右键扩展功能小工具详解》 在日常的计算机操作中,我们常常需要查看或隐藏系统的文件和文件扩展名,这些操作往往需要通过“文件夹选项”进行繁琐的设置。为了解决这一问题,出现了名为“系统右键扩展功能”的...

    无线网卡 上网拨号软件 扩展短信功能

    在IT领域,无线网卡、上网拨号软件以及扩展短信功能是网络通信和移动设备连接互联网的重要组成部分。这里,我们将详细探讨这三个关键概念,并以"Mobile Partner"为例,阐述其在实际应用中的作用。 首先,无线网卡是...

    应用接口|超级菜单|扩展功能一支持库

    总结来说,这个"应用接口|超级菜单|扩展功能一支持库"是一个专为开发者设计的工具集,它提供了丰富的菜单系统和多种扩展功能,以帮助他们构建更高效、更具吸引力的软件应用。通过使用这样的支持库,开发者不仅可以...

    为软件系统锦上添花_57款扩展软件功能的工具软件

    根据提供的标题、描述及相关内容,本文将详细介绍一系列用于扩展或改进现有软件功能的工具软件,旨在帮助用户增强其日常使用的Windows操作系统、Office办公套件、浏览器、电子邮件客户端管理软件及媒体播放器等功能...

    软件架构的非功能性需求指标和区域化支持.pdf

    软件架构的非功能性需求指标和区域化支持 软件架构的非功能性需求指标是软件架构中一个重要的组成部分,它们直接影响软件系统的性能、可靠性、安全性等方面。非功能性需求是软件架构师在设计软件系统时需要考虑的...

    多功能条例程扩展支持库六

    在IT行业中,程序扩展支持库扮演着至关重要的角色,它们为开发者提供了丰富的功能,使得软件开发更为高效且灵活。"多功能条例程扩展支持库六"就是这样一个资源,它旨在为程序员提供多方面的功能,帮助他们编写更加...

    单机版RS485集中抄表软件:支持645-2007协议智能电表本地有线抄表,远程抄表功能待测试扩展,单机版RS485集中抄表软件:支持645-2007协议智能电表本地有线抄表,远程抄表功能待测试扩展

    单机版RS485集中抄表软件:支持645-2007协议智能电表本地有线抄表,远程抄表功能待测试扩展,单机版RS485集中抄表软件:支持645-2007协议智能电表本地有线抄表,远程抄表功能待测试扩展,单机版RS485集中抄表软件,...

    扩展界面一|扩展界面一支持库

    在IT领域中,扩展界面(Extension Interface)是一种设计模式,允许软件系统通过接口来添加新的功能或增强现有功能。这些接口为开发者提供了可扩展性,使得应用程序能够根据需求进行定制和升级,而无需修改原始代码...

    易语言调试功能扩展

    本文将深入探讨“易语言调试功能扩展”这一主题,这是一份源码资源,旨在增强易语言程序的调试能力,帮助开发者更好地理解和优化他们的代码。 调试是软件开发过程中的关键环节,它允许程序员定位并修复代码中的错误...

    eLIB扩展2支持库

    "eLIB扩展2支持库"是一个专为软件开发者设计的库,它提供了丰富的功能,以增强和扩展基本的eLIB功能。eLIB,全称为电子图书馆库,是一个开源的、跨平台的库集合,主要用于处理文本、数据、文件和其他...

    串口扩展卡的驱动软件

    串口扩展卡驱动软件是计算机硬件系统中用于管理和控制串行接口扩展卡的软件组件,它使得操作系统能够识别并有效利用这些硬件资源。在本文中,我们将深入探讨串口扩展卡的基本概念,串口扩展卡驱动软件的工作原理,...

    一款实用的电脑右键扩展软件

    该软件的核心功能在于其右键菜单的扩展性。它允许用户根据个人工作习惯和需求,添加或移除特定的右键菜单项。例如,你可以将常用的文件压缩、解压、转换格式等操作添加到右键菜单,从而节省了打开应用程序再执行相应...

    易语言 的无限支持扩展库

    总的来说,“易语言的无限支持扩展库”为易语言的使用者提供了丰富的功能扩展,使他们能够更高效地开发出功能强大的应用程序。通过合理利用这些扩展库,即使是编程初学者也能快速掌握编程技能,实现自己的创新想法。

    软件工程与软件可扩展性评估.pptx

    **软件可扩展性定义**:是指软件系统在不改变其基本结构的前提下,能够方便地扩展功能、提高性能和适应新的需求的能力。 **软件可扩展性评估的重要性**: - **预防功能堆砌**:避免因不断增加新功能而导致系统变得...

    LUA扩展支持库

    总的来说,"LUA扩展支持库" 是为了提升Lua的功能性和实用性,让开发者能够更好地结合C/C++的性能优势和Lua的简洁语法,创建出功能强大且高效的软件解决方案。通过深入理解和熟练运用这些扩展技术,开发者可以将Lua的...

Global site tag (gtag.js) - Google Analytics