2011-06-13 264 views
4

我正在写一些阿帕奇(2.2)中的C模块,我在它很新,所以我想知道:全局变量

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

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

因此,列表应该是全局的(这样每个服务器实例将具有相同的列表实例),并且我需要在开始时对它进行初始化。

如果可能,我该怎么做?

谢谢!

+0

该列表是静态的,还是从某些外部源加载? – 2011-06-13 11:34:16

+0

我希望列表在启动时从简单的文本文件加载。 – user795810 2011-06-13 12:02:41

回答

4

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

我将apr_pool_userdata_getapr_pool_userdata_set方法用于进程的全局池(pconf和pool)。

为了进一步参考:
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... 
} 
0

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

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