Apache Server中的全局变量

时间:2011-06-13 11:26:11

标签: c apache apache-modules

我正在用C编写一些apache(2.2)模块,我对它很新,所以我想知道:

我需要知道是否可以创建一个全局变量,只要apache服务器开始运行就会启动该变量。

请参阅,我需要一个主机名列表(这将是“特权”),以便我得到的每个请求,我都需要检查主机名是否出现在列表中(以检查它是否是“普遍存在的”) )。

所以列表应该是全局的(这样每个服务器实例都会有相同的列表实例),我需要在开头初始化它。

如果可能的话,我该怎么做?

谢谢!

2 个答案:

答案 0 :(得分:4)

虽然不是一个完整的答案,但我确实设法找到了一种全局变量的方法。

我在进程的全局池(pconf和pool)中使用了apr_pool_userdata_getapr_pool_userdata_set方法。

供进一步参考:
http://apr.apache.org/docs/apr/0.9/group_apr_pools.html

示例:

将静态全局数据附加到服务器进程池

char *data = "this is some data";
apr_pool_userdata_setn ((void*) data, "myglobaldata_key", NULL, request->server->process->pool);

将malloced堆数据附加到服务器进程池

char *data = strdup("this is some data");
apr_pool_userdata_setn ((void*) data, "myglobaldata_key", (apr_status_t(*)(void *))free, request->server->process->pool);

现在检索全局数据:

char *data;
apr_pool_userdata_get ((void**)&data, "myglobaldata_key", request->server->process->pool);
if (data == NULL) {
    // data not set...
}

答案 1 :(得分:0)

此链接表示可以在模块中使用静态/全局变量,它们在从多个线程访问时需要小心。我的观察是,鉴于可能存在多个进程(全局变量将存在于一个进程中,由许多线程共享),静态不应该被指望初始化。即初始化一次可能还不够。

http://httpd.apache.org/docs/2.2/developer/thread_safety.html#variables