linux下的插件

linux下的插件使用举例: 通过选取插件中的运算方式, 列出使得(5_3)_2 == 4等式成立的全部运算组合.

op.c

// (5 _ 3) _ 2 == 4

#include <stdio.h>
#include <glob.h>
#include <string.h>
#include <dlfcn.h>

#ifndef PATH
  #define PATH "./plugin/*.plugin"
#endif

typedef int opt_t(int, int);

typedef struct {
    void *handle;
    opt_t *op;
    char ch;
    int inuse;
} oper_t;

#define MAX 10

int main(void)
{
    oper_t oparr[MAX];
    glob_t globbuf;
    int ret, i, j;
    void *tmp;

    memset(oparr, ‘\0‘, sizeof(oparr));

    ret = glob(PATH, 0, NULL, &globbuf);    //all files  that matched pathname are stored in globbuf

    for (i = 0; i < globbuf.gl_pathc; ++i) {
        oparr[i].handle = dlopen(globbuf.gl_pathv[i], RTLD_LAZY);
        if (!oparr[i].handle) {
            fprintf(stderr, "dlopen error.\n");
            return -1;
        }

        oparr[i].op = dlsym(oparr[i].handle, "func");
        tmp = dlsym(oparr[i].handle, "symbol");
        oparr[i].ch = ((char (*)(void))tmp)();
        //oparr[i].ch = ((char (*)(void))dlsym(oparr[i].handle, "symbol"))();

        oparr[i].inuse = 1;
    }
    globfree(&globbuf);

    for (i = 0; i < MAX; ++i) {
        if (oparr[i].inuse == 0) {
            continue;
        }
        for (j = 0; j < MAX; ++j) {
            if (oparr[j].inuse == 0) {
                continue;
            }
            if (oparr[j].op(oparr[i].op(5, 3), 2) == 4) {
                printf("(5 %c 3) %c 2 == 4\n", oparr[i].ch, oparr[j].ch);
            }
        }
    }

    for (i = 0; i < MAX; ++i) {
        if (oparr[i].inuse == 0) {
            continue;
        }
        dlclose(oparr[i].handle);
    }

    return 0;
}

在没有插件时代码执行输出如下:

在plugin目录中添加如下文件, 并编译生成动态库文件:

add.c

int func(int a, int b)
{
    return a + b;
}

char symbol(void)
{
    return ‘+‘;
}

sub.c

int func(int a, int b)
{
    return a - b;
}

char symbol(void)
{
    return ‘-‘;
}

mul.c

int func(int a, int b)
{
    return a * b;
}

char symbol(void)
{
    return ‘*‘;
}

div.c

int func(int a, int b)
{
    return a / b;
}

char symbol(void)
{
    return ‘/‘;
}

mod.c

int func(int a, int b)
{
    return a % b;
}

char symbol(void)
{
    return ‘%‘;
}

power.c

int func(int a, int b)
{
    int i, sum;

    for (i = 0, sum = 1; i < b; ++i)
    {
            sum *= a;
    }

    return sum;
}

char symbol(void)
{
    return ‘^‘;
}

输出如下:

此例中, 程序通过glob()函数, 找到所有匹配的文件. 通过dlsym()从匹配到的文件中逐个查询指定符号的值. 并将查询结果记录下来.

用记录下来的查询结果, 对给出的数字进行穷举匹配, 并判断匹配结果. 如果结果为真就打印匹配结果.

时间: 2024-09-30 21:30:02

linux下的插件的相关文章

分享在Linux下使用OSGi.NET插件框架快速实现一个分布式服务集群的方法

在这篇文章我分享了如何使用分层与模块化的方法来设计一个分布式服务集群.这个分布式服务集群是基于DynamicProxy.WCF和OSGi.NET插件框架实现的.我将从设计思路.目标和实现三方面来描述. 1 设计思路 首先,我来说明一下设计思路.我们先来看看目前OSGi.NET插件框架的服务.在这里,服务不是远程服务,它是轻量级的服务,由接口和实现类组成,如下图所示.服务契约插件定义了服务接口,服务实现插件向服务总线注册服务,服务调用插件利用服务契约(接口)从服务总线获取实现的服务并调用,服务实现

Linux下启用Chrome/Firefox的Java插件

JDK 已经安装好,但是浏览器运行 Java Applet 时提示需安装 Java 插件. 这时,在浏览器安装目录中 plugins 文件夹下创建2个重要的符号链接即可. libnpjp2.so   (this file exist in /usr/lib/jvm/jdk1.6.0_35/jre/lib/i386/libnpjp2.so) libjavaplugin_oji.so (this file exist in /usr/lib/jvm/jdk1.6.0_35/jre/plugin/i3

Linux下安装Eclipse的PHP插件(PHPEclipse)

下载: Eclipse: http://www.eclipse.org/downloads/       (本人用的Ubuntu,直接在SoftWare Center中下载的) (选择适合你系统的相应版本,支持windows,linux,max等) PHPeclipse插件: http://sourceforge.net/projects/phpeclipse/ 安装: 均为绿色软件,无须安装. 将下载回来的Eclipse压缩包解开,放到常用安装软件文件夹即可. 将PHPeclipse插件解压,

Linux 下 Sublime Text 添加 InputHelper 插件输入中文

Linux 下的 Sublime Text 不支持中文输入,我也是醉了. 网上找了一些方法,都没有成功,最后就用 InputHelper 折中一下了,虽然麻烦,但好歹能写中文了. InputHelper 因为是以弹出个窗口方式输入,所以理论上支持系统所使用的所有中文输入法. 安装方法: $ cd ~/.config/sublime-text-3/Packages $ git clone https://github.com/xgenvn/InputHelper.git 或者 去下载 InputH

10.6 监控io性能 - 10.7 free命令 - 10.8 ps命令 - 10.9 查看网络状态 - 10.10 linux下抓包

- 10.6 监控io性能 - 10.7 free命令 - 10.8 ps命令 - 10.9 查看网络状态 - 10.10 linux下抓包 - 扩展tcp三次握手四次挥手 http://www.doc88.com/p-9913773324388.html  - tshark几个用法:http://www.aminglinux.com/bbs/thread-995-1-1.html  # 10.6 监控io性能 ![mark](http://oqxf7c508.bkt.clouddn.com/b

Linux下Nagios的安装与配置[转]

一.Nagios简介 Nagios是一款开源的电脑系统和网络监视工具,能有效监控Windows.Linux和Unix的主机状态,交换机路由器等网络设置,打印机等.在系统或服务状态异常时发出邮件或短信报警第一时间通知网站运维人员,在状态恢复后发出正常的邮件或短信通知. Nagios原名为NetSaint,由Ethan Galstad开发并维护至今.NAGIOS是一个缩写形式: "Nagios Ain't Gonna Insist On Sainthood" Sainthood 翻译为圣徒

Linux下安装禅道管理系统7.2

提示:禅道是用PHP开发的,只要安装一个MySQL,找一个能跑PHP的web应用服务器,把禅道源代码放到里面,然后按步骤安装就可以了.不一定要用XAMPP,XAMPP只是把PHP环境和MySQL都集成了而已. 禅道简介 禅道项目管理软件(ZenTaoPMS)是一款国产的,基于ZPL协议,开源免费的项目管理软件,它集产品管理.项目管理.测试管理于一体,同时还包含了事务管理.组织管理等诸多功能,是一款功能完备的项目管理软件,完美地覆盖了项目管理的核心流程,是中小型企业项目管理的首选. 禅道项目管理软

linux下多线程下载工具axel的编译安装

axel 是Linux 命令行下多线程的下载工具,支持断点续传,速度通常情况下是Wget的几倍 官方主页:http://axel.alioth.debian.org/ 源码下载: #curl -O http://pkgs.fedoraproject.org/repo/pkgs/axel/axel2.4.tar.gz/a2a762fce0c96781965c8f9786a3d09d/axel-2.4.tar.gz 编译安装: # tar -xvf axel-2.4.tar.gz  && cd

程序的链接和装入及Linux下动态链接的实现

http://www.ibm.com/developerworks/cn/linux/l-dynlink/ 程序的链接和装入及Linux下动态链接的实现 程序的链接和装入存在着多种方法,而如今最为流行的当属动态链接.动态装入方法.本文首先回顾了链接器和装入器的基本工作原理及这一技术的发展历史,然后通过实际的例子剖析了Linux系统下动态链接的实现.了解底层关键技术的实现细节对系统分析和设计人员无疑是必须的,尤其当我们在面对实时系统,需要对程序执行时的时空效率有着精确的度量和把握时,这种知识更显重