Chinaunix首页 | 论坛 | 博客
  • 博客访问: 4465022
  • 博文数量: 192
  • 博客积分: 10014
  • 博客等级: 上将
  • 技术积分: 8232
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-21 00:22
文章分类

全部博文(192)

文章存档

2011年(4)

2009年(14)

2008年(174)

我的朋友

分类: C/C++

2008-03-08 23:23:30

本文转自:
 
原文如下:
 
Apache模块开发/用C语言扩展apache(3:一个非常简单的apache module)
by linux_prog
    有了上面几篇文章的基础,大家自己再下点功夫,应该可以去写一些简单的模块了,
下面贴出一个很简单的apache module,大家一起分析一下。
    $ cd /usr/local/apache2.2.4
    $ vi mod_c.c
 

#include <time.h>
#include <stdlib.h>
#include "apr.h"
#include "apr_lib.h"
#include "apr_strings.h"

#define APR_WANT_STRFUNC
#include "apr_want.h"

#include "httpd.h"
#include "http_config.h"
#include "http_core.h"
#include "http_request.h"

module AP_MODULE_DECLARE_DATA c_module;

static int c_handler(request_rec *r)
{
 r->content_type="text/plain";
 ap_rprintf(r,"handler:%s\n",r->handler);
 ap_rprintf(r,"query string:%s\n",r->args);
 ap_rprintf(r,"filename:%s\n",r->filename);
 return OK;
}
static void register_hooks(apr_pool_t *p)
{
 ap_hook_handler(c_handler, NULL, NULL, APR_HOOK_MIDDLE);
}

/* module structure */
module AP_MODULE_DECLARE_DATA c_module = {
    STANDARD20_MODULE_STUFF,
    NULL, /* dir config creater */
    NULL, /* dir merger — default is to override */
    NULL, /* server config */
    NULL, /* merge server configs */
    NULL, /* command apr_table_t */
    register_hooks /* register hooks */
};

编译并安装这个模块(apache提供的apxs非常好):
     $ ./bin/apxs -c ./mod_c.c
     $ ./bin/apxs -a -i -n c mod_c.la
     这时apxs会自动帮我们把编译好的mod_c.so安装到modules/目录中,而且httpd.conf中已经把这个module load进去了:
     [root@cn-weblog apache2.2.4]# grep mod_c conf/httpd.conf     
      LoadModule c_module           modules/mod_c.so
    
     测试这个模块:
     $ ./bin/apachectl stop
     $ ./bin/apachectl start

     在IE中访问
     IE中会出现:
handler:text/html
query string:query=yy
filename:/usr/local/apache2.2.4/htdocs/index.html
     说明该module运行成功。
    
     把上面的module简单解释一下。
    
     所有的apache module都必须是这个结构体,里面要定义各个内容。
/* module structure */
module AP_MODULE_DECLARE_DATA c_module = {
    STANDARD20_MODULE_STUFF,
    NULL,      /* dir config creater */
    NULL,                       /* dir merger — default is to override */
    NULL,      /* server config */
    NULL,                       /* merge server configs */
    //上面4项都是定义httpd.conf中命令的作用的
    NULL,      /* command apr_table_t */ //定义在httpd.conf中添加的命令,和各命令的处理函数
    register_hooks    /* register hooks */      //hooks,定义什么时候执行我们这个module的相关函数
};

    ap_hook_handler(c_handler, NULL, NULL, APR_HOOK_MIDDLE);
    表示在处理内容请求时调用我们函数–c_handler
   
    

阅读(1795) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~