Глобальные переменные в сервере Apache



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



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



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



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



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



Спасибо!

858   2  

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

    Ничего не найдено.