我正在开发一个Apache 2模块。为什么在服务启动时会调用create_server_config两次?

时间:2013-01-31 07:23:04

标签: apache apache-modules apache2-module

我写了这样的模块代码:

static void *example_create_server_config(apr_pool_t *p, server_rec *s)
{
  syslog(LOG_ERR, "create_server_config");
  // create my handler
  // my_handler_t *handler = (my_handler_t *)apr_palloc(pool, sizeof(my_handler_t));
  return NULL;
}

/* Dispatch list for API hooks */ 
module AP_MODULE_DECLARE_DATA example_module = {
    STANDARD20_MODULE_STUFF,
    NULL,                               /* create per-dir    config structures */
    NULL,                               /* merge  per-dir    config structures */
    example_create_server_config,       /* create per-server config structures */
    NULL,                               /* merge  per-server config structures */
    example_cmds,                       /* table of config file commands       */
    example_register_hooks              /* register hooks                      */
};

当我重启Apache时,/var/log/syslog包含这个:

Jan 31 14:46:49 su02 apache2: create_server_config
Jan 31 14:46:49 su02 apache2: create_server_config
Jan 31 14:46:49 su02 apache2: child_init

为什么create_server_config函数被调用两次?

我在这个函数中malloc了一些全局变量。这样安全吗?

1 个答案:

答案 0 :(得分:1)

使用您在此函数内部收到的apr_pool_t指针获取内存是完全安全的。此外,对于httpd.conf文件中的每个服务器/主机配置,将调用此函数一次,这就是为什么您看到对此函数的多次调用。例如,根服务器配置和一个配置部分将使该函数被调用两次。

typedef struct
{
    int value;
} my_srv_cfg;

static void *example_create_server_config(apr_pool_t *pool, server_rec *s)
{
    my_srv_cfg *new = apr_pcalloc(pool, sizeof (*new));
    new->value = 100;
    return new; 
}