如何正确创建 G-Wan 全局变量?
Posted
技术标签:
【中文标题】如何正确创建 G-Wan 全局变量?【英文标题】:How do I create a G-Wan global variable properly? 【发布时间】:2015-01-20 01:22:20 【问题描述】:--- config.h
extern char userurl[3];
char userurl[3];
--- 索引.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 is not freed...
为 gwan 声明 extern
或 global
变量的正确方法是什么?
【问题讨论】:
简单的解决方法:初始化你的变量。userurl[0]='\0'
另外,您的代码容易受到缓冲区溢出攻击(并且确实 userurl 已溢出),因此请注意这一点。
【参考方案1】:
每个 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 等几个示例说明了如何进行实际程序。
【讨论】:
在这种情况下不寻找跨多个实例调用的持久性。我正在寻找该特定实例的全局变量,并希望在每次运行后释放(gc)该实例的全局变量 请定义“实例”。 G-WAN 持久指针用于单个 G-WAN 实例(但可能并发脚本通过多个线程运行)。如果您需要一个变量在请求或连接期间存在,请使用 US_REQUEST_DATA(并使用 gc_alloc() 分配上下文)。 我不希望变量在请求或连接期间仍然存在。我希望它在客户端关闭连接时被“释放”。 Nagi 建议的正确方法是什么? 查看 stream[1,2,3].c 示例 - 他们就是这样做的(使用 G-WAN 的垃圾收集器将内存上下文分配给“alloc and forget”)。以上是关于如何正确创建 G-Wan 全局变量?的主要内容,如果未能解决你的问题,请参考以下文章