2014-11-21 6 views
3

--- config.hКак создать глобальную переменную G-Wan правильно?

extern char userurl[3]; 
char userurl[3]; 

--- index.c

include "config.h" 

int main(int argc, char *argv[]) { 
    char *req_g="",*req_p=""; 

    get_arg("g=", &req_g, argc,argv); 
    get_arg("p=", &req_p, argc,argv); 

    strcat(userurl,req_g); 
    strcat(userurl,req_p); 
    .. 

    xbuf_xcat(reply,"%s",userurl); 
    .. 

    return 200; 
} 

Тогда я использовал http://127.0.0.1:8080/?index&g=a&p=b

Я перезагружать несколько раз, и результаты дублируют: userurl не освобождается. ..

Каков правильный способ объявления extern или global переменных для gwan?

+0

Простая работа: инициализируйте переменную. 'userurl [0] = '\ 0'' Кроме того, ваш код подвержен атакам переполнения буфера (и, действительно, userurl переполнен), поэтому будьте осторожны. – Nagi

ответ

0

Каждый скрипт G-WAN составлен отдельно. В результате все ваши переменные: static (локально к этому модулю) - вы не можете делиться ими без использования указателей и атомных операций.

Для того, чтобы облегчить использование глобальных переменных, G-WAN обеспечивает постоянные указатели (US_HANDLER_DATA, US_VHOST_DATA или US_REQUEST_DATA):

void *pVhost_persistent_ptr = (void*)get_env(argv, US_VHOST_DATA); 
if(pVhost_persistent_ptr) 
    printf("%.4s\n", pVhost_persistent_ptr); 

// get a pointer on a pointer (to CHANGE the pointer value) 
void **pVhost_persistent_ptr = (void*)get_env(argv, US_VHOST_DATA); 
if(pVhost_persistent_ptr) 
    *pVhost_persistent_ptr = strdup("persistent data"); 

Несколько примеров, как persistence.c или stream3.c иллюстрируют, как приступить к реальных программ.

+0

не ищет постоянства при вызове нескольких экземпляров в этом случае. Я ищу глобальную переменную для этого конкретного экземпляра и надеюсь, что глобальная переменная экземпляра будет освобождена (gc) после каждого запуска. – stashfree

+0

Пожалуйста, определите * «экземпляр» *. Постоянные указатели G-WAN предназначены для одного экземпляра G-WAN (но потенциально параллельный скрипт работает через несколько потоков). Если вам нужна переменная, чтобы выжить на время запроса или подключения, используйте ** US_REQUEST_DATA ** (и выделите контекст с помощью ** gc_alloc() **). – Gil

+0

Я не хочу, чтобы переменная выживала на время запроса или соединения. Я бы хотел, чтобы он был «освобожден» после закрытия клиента. Это то, что Наги предложил надлежащий путь для этого? – stashfree

Смежные вопросы