c - Apache 模块中的静态变量被多次初始化?

标签 c apache module apache2 global-variables

我为 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=1isInit=0, isInit=1 在其他方面。

我的问题是,我如何定义一个变量,该变量可在 test_handler() 中访问并在函数调用之间保留其值?

最佳答案

我想,我找到了问题所在。 Apache Server for Linux 创建多个“子”服务器来处理并行请求。每个虚拟服务器加载配置,包括模块实例,因此如果 ApacheServer 创建 8 个子服务器进程,则您有 8 个 isInit 变量副本。您可以将 Apache 配置为只创建一个服务器(不推荐 - 性能)。另一种方法是将 Apache 服务器配置为使用其他多进程技术,我阅读了 abot prefork 和 worker。根据 Windows 上的 Apache2 文档,服务器使用 Windows API,因此您可以迁移到 Windows 或编写可作为多个并行实例工作的模块。

关于c - Apache 模块中的静态变量被多次初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5934913/

相关文章:

c - epoll, kqueue, 用户指定指针 : how to safely deallocate it in a multithreaded envinronment?

c - 我如何在 git 中运行命令 emerge?

php - mime_content_type 仅返回 css 和 js 文件的文本/纯文本

ruby-on-rails - Rails 应用程序部署问题

interface - OCaml 接口(interface)与签名?

javascript - 鉴于 ES2015、依赖注入(inject)和库抽象,我理想的模块在 2016 年应该是什么样子?

选择多平台数据可视化的编程语言

c++ - Windows DLL 用文件初始化常量 c 字符串数组

java - 我已经编写了一个 Java servlet 代码来下载文件但出现错误

python - 使用 "knee.py"导入 numpy 和 scipy 时出现神秘错误