我为Apache HTTP服务器编写了一个模块,发现了奇怪的行为。我假设静态变量只初始化一次,但是我编写了下面的代码并向Apache发出了两个请求,输出是:
test_handler: isInit=0
test_handler: isInit=1
test_handlere: isInit=0
test_handlere: isInit=1
测试代码:
static int isInit = 0;
static int test_handler( request_rec *r ) {
fprintf(stderr,"\n\natest_handler: isInit=%d", isInit );
if( !isInit ) {
isInit = 1;
}
fprintf(stderr,"\natest_handler: isInit=%d", isInit );
fflush(stderr);
return DECLINED;
}
static void register_hooks(apr_pool_t *p) {
fprintf(stdout,"register_hooks\n");
ap_hook_translate_name(test_handler, NULL, NULL, APR_HOOK_FIRST);
fprintf(stdout,"register_hooks done\n");
}
module AP_MODULE_DECLARE_DATA test_module = {
STANDARD20_MODULE_STUFF,
NULL, /* create per-dir config structures */
NULL, /* merge per-dir config structures */
NULL, /* create per-server config structures */
NULL, /* merge per-server config structures */
NULL, /* table of config file commands */
register_hooks /* register hooks */
};
这个问题与线程有关,因为当我对Apache执行10个请求时,在某些情况下会看到
isInit=1, isInit=1
,而在其他情况下会看到isInit=0, isInit=1
。我的问题是,我如何定义一个变量,它可以在
test_handler()
中访问,并在调用函数之间保留其值? 最佳答案
我想,我找到了问题所在。ApacheServerforLinux创建了几个“子”服务器来服务并行请求。每个虚拟服务器都会加载配置,包括模块实例,因此如果ApacheServer创建8个子服务器进程,则需要8个isInit变量副本。您可以将Apache配置为只创建一个服务器(不推荐使用-性能)。另一种方法是将Apache服务器配置为使用其他多进程技术,我阅读abot prefork和worker。根据Windows上的Apache2文档,服务器使用WindowsAPI,因此您可以迁移到Windows或编写可以作为多个并行实例工作的模块。
关于c - Apache模块中的静态变量是否要初始化一次?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5934913/