1

私は次のようにモジュールコードを書きました:

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関数が2回呼び出されるのはなぜですか?

この関数でいくつかのグローバル変数をmallocします。それは安全ですか?

4

1 に答える 1

1

この関数内で受け取るapr_pool_tポインタを使用してメモリを取得することは完全に安全です。また、この関数はhttpd.confファイルにあるサーバー/ホスト構成ごとに1回呼び出されるため、この関数への呼び出しが複数表示されます。たとえば、ルートサーバー構成と1つの構成セクションでは、この関数が2回呼び出されます。

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; 
}
于 2013-02-04T05:58:07.500 に答える