2011-06-13 181 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