Глобальные переменные в Apache Server - PullRequest
4 голосов
/ 13 июня 2011

Я пишу некоторые модули Apache (2.2) на C, и я довольно новичок в этом, поэтому мне было интересно:

Мне нужно знать, возможно ли создать глобальную переменную, которая будетинициируется всякий раз, когда сервер apache начинает работать.

Видите, мне нужно иметь список имен хостов (которые будут "привилегированными"), так что при каждом запросе, который я получаю, мне нужно проверять, если имя хостапоявляется в списке (чтобы проверить, является ли он «превалирующим»).

Таким образом, список должен быть глобальным (чтобы каждый экземпляр сервера имел один и тот же экземпляр списка), и мне нужно инициализировать его вначало.

Как мне это сделать, если это вообще возможно?

Спасибо!

Ответы [ 2 ]

4 голосов
/ 17 июня 2011

Хотя это и не полный ответ, мне удалось найти способ иметь глобальные переменные.

Я использовал методы apr_pool_userdata_get и apr_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);

присоединение данных о неправильно размещенной куче к пулу процессов сервера

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 голосов
/ 20 февраля 2015

Эта ссылка указывает на то, что в модуле можно использовать статические / глобальные переменные, они требуют осторожности при доступе из нескольких потоков. Мое наблюдение состоит в том, что, учитывая, что может быть несколько процессов (глобальная переменная будет жить в процессе, совместно используемом многими потоками), статические не следует рассчитывать на инициализацию. Т.е. однократной инициализации, вероятно, недостаточно.

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

...