Глобальные переменные в Apache Server
Я пишу некоторые модули Apache (2.2) на C, и я довольно новичок в этом, поэтому мне было интересно:
Мне нужно знать, возможно ли создать глобальную переменную, которая будет инициироваться всякий раз, когда сервер Apache начинает работать.
Понимаете, мне нужно иметь список имен хостов (которые будут "привилегированными"), чтобы при каждом запросе, который я получаю, мне нужно было проверять, появляется ли имя хоста в списке (чтобы проверить, является ли оно "превалирующим").
Таким образом, список должен быть глобальным (чтобы каждый экземпляр сервера имел один и тот же экземпляр списка), и мне нужно инициализировать его в начале.
Как мне это сделать, если это вообще возможно?
Спасибо!
2 ответа
Хотя это и не полный ответ, мне удалось найти способ иметь глобальные переменные.
Я использовал 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...
}
Эта ссылка указывает на то, что в модуле можно использовать статические / глобальные переменные, они требуют осторожности при доступе из нескольких потоков. Мое наблюдение состоит в том, что, учитывая, что может быть несколько процессов (глобальная переменная будет жить в процессе, совместно используемом многими потоками), статические не следует рассчитывать на инициализацию. Т.е. инициализации один раз наверное недостаточно.
http://httpd.apache.org/docs/2.2/developer/thread_safety.html