我正在用C编写一些apache(2.2)模块,我对它很新,所以我想知道:
我需要知道是否可以创建一个全局变量,只要apache服务器开始运行就会启动该变量。
请参阅,我需要一个主机名列表(这将是“特权”),以便我得到的每个请求,我都需要检查主机名是否出现在列表中(以检查它是否是“普遍存在的”) )。
所以列表应该是全局的(这样每个服务器实例都会有相同的列表实例),我需要在开头初始化它。
如果可能的话,我该怎么做?
谢谢!
答案 0 :(得分:4)
虽然不是一个完整的答案,但我确实设法找到了一种全局变量的方法。
我在进程的全局池(pconf和pool)中使用了apr_pool_userdata_get
和apr_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