Глобальные переменные в сервере Apache
Я пишу некоторые модули 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_ апр _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... }
Эта ссылка указывает, что можно использовать статические / глобальные переменные в модуле, они требуют осторожности при доступе из нескольких потоков. Мое наблюдение состоит в том, что, учитывая, что может быть несколько процессов (глобальная переменная будет жить в процессе, разделяемом многими потоками), статика не должна считаться инициализированной. Т. е. инициализации один раз, вероятно, недостаточно.
Http://httpd.apache.org/docs/2.2/developer/thread_safety.html#variables
Comments