写了个简单的helloworld,运行了下,还是比较的顺利,记录下来。
主程序:
#include <netdb.h> #include <string.h> #include <arpa/inet.h> #include <http_protocol.h> #include <http_config.h> //处理用户请求的函数 static int helloworld_handler(request_rec *r) { if( !r->handler || ( strcmp( r->handler, "helloworld" ) != 0 ) ) { if( r->method_number != M_GET ) { return HTTP_METHOD_NOT_ALLOWED; } ap_set_content_type( r, "text/html;charset=ascii" ); ap_rputs( "<!DOCTYPE HTML PUBLIC /"-//W3C//DTD HTML 4.01//EN/">/n", r ); ap_rputs( "<html><head><title>Apache Helloworld " "Module</title></head>", r ); ap_rputs( "<body><h1>Hello World!</h1>", r ); ap_rputs( "<p>This is the Apache HelloWorld module!</p>", r ); ap_rputs( "</body></html>", r); return OK; } } static void helloworld_register_hooks(apr_pool_t *p) { ap_hook_handler(helloworld_handler, NULL, NULL, APR_HOOK_LAST); } module AP_MODULE_DECLARE_DATA helloworld_module = { STANDARD20_MODULE_STUFF, NULL, /* create per-directory config structures */ NULL, /* merge per-directory config structures */ NULL, NULL, /* merge per-server config structures */ NULL, helloworld_register_hooks /* register hooks */ };
Makefile
APACHE=/usr/local/apache2 APXS = $(APACHE)/bin/apxs LDPATH=/ INCLUDE=/ -I. / -I$(APACHE)/include/ -I/usr/include/apr-1 / CC = gcc GCC = g++ CFLAG = -c -g -pg -Wall $(INCLUDE) -fPIC MODDEF = -DLINUX=2 -DUSE_HSREGEX -DUSE_EXPAT -fPIC -DSHARED_MODULE LDFLAGS = -shared .SUFFIXES: .o .cpp .c .mod .so MODOBJS = helloworldMOD = mod_helloworld.mod all: mod_helloworld.so mod_helloworld.so: $(MODOBJS) $(helloworldMOD) $(CC) $(LDFLAGS) $(LDPATH) -o $@ $(helloworldMOD) $(MODOBJS) -lpthread -lz -lm -lstdc++ -ldl .cpp.o: $(GCC) $(CFLAG) -o $@ $< .c.o: $(CC) $(CFLAG) -o $@ $< .c.mod: $(CC) $(CFLAG) $(MODDEF) -o $@ $< clean: rm -f *.o *.mod rm -f mod_helloworld.so
在配置文件中添加:
LoadModule helloworld_modulemodules/mod_helloworld.so <Location /helloworld> SetHandler helloworld </Location>
启动apache
在游览器中打入 http://10.13.127.224:8880/helloword
This is the Apache HelloWorld module!
接下来对程序进行简单的介绍,我们看到27-26行定义了一个结构,这个就是apache模块的结构,我们可以看到整个结构基本是默认或者NULL,只有最后面的有个 helloworld_register_hooks ,它是一个函数指针,指向的函数就是定义在 23-26行,主要是用来注册钩子函数的,当前的程序只注册一个钩子函数 ap_hook_handler,它的参数分别是钩子处理函数指针、前缀模块名字、后缀模块名字以及挂钩的综合排序参数。
当用户请求过来的时候,系统会调用钩子函数ap_hook_handler,我们发现里面有个strcmp( r->handler, "helloworld" ) != 0的判断,这个是为什么呢?
这是因为系统在定位钩子函数的时候,它首先定位到钩子,接着遍历钩子函数,直到找到对应的处理函数为止,所以在这里进行这么一个判断,防止处理了不应该接受的请求。