2014-11-21 77 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不会释放。 ..

什么是正确的方式来申报externglobal变量gwan?

+0

易于使用:初始化您的变量。 'userurl [0] ='\ 0'' 此外,你的代码容易发生缓冲区溢出攻击(事实上userurl溢出),所以要注意这一点。 – Nagi 2014-11-22 00:26:06

回答

0

每个G-WAN脚本分别编译。因此,所有变量都是static(本地模块) - 如果不使用指针和原子操作,则不能共享它们。

为了缓解使用全局变量,G-WAN提供持久性指针(US_HANDLER_DATAUS_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.cstream3.c说明如何入手现实生活中的节目。

+0

在这种情况下不寻找跨多个实例调用的持久性。我正在寻找该特定实例的全局变量,并希望在每次运行后释放实例的全局变量(gc) – stashfree 2014-11-22 21:43:50

+0

请定义*“instance”*。 G-WAN持久指针适用于单个G-WAN实例(但可能并发脚本通过多个线程运行)。如果你需要一个变量来保存请求或连接的时间,那么使用** US_REQUEST_DATA **(并且用** gc_alloc()**)分配上下文。 – Gil 2014-11-23 13:45:58

+0

我不希望变量在请求或连接时间内存活。我希望它在客户关闭连接时“被释放”。 Nagi是否建议了正确的方法? – stashfree 2014-11-24 08:35:38