如何正确创建 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 声明 externglobal 变量的正确方法是什么?

【问题讨论】:

简单的解决方法:初始化你的变量。 userurl[0]='\0' 另外,您的代码容易受到缓冲区溢出攻击(并且确实 userurl 已溢出),因此请注意这一点。 【参考方案1】:

每个 G-WAN 脚本都单独编译。因此,您的所有变量都是 static(此模块的本地变量) - 如果不使用指针和原子操作,您将无法共享它们。

为了方便全局变量的使用,G-WAN 提供了持久指针(US_HANDLER_DATAUS_VHOST_DATAUS_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 全局变量?的主要内容,如果未能解决你的问题,请参考以下文章

为啥lua语言中使用全局变量就会造成内存泄漏

有没有更好的方法来定义全局变量?

创建全局映射变量

求助,QT creator怎么定义全局变量

计算机系统篇之链接(11):为什么要避免在 C/C++ 中使用全局变量

计算机系统篇之链接(11):为什么要避免在 C/C++ 中使用全局变量