如何正确创建G-Wan全局变量?

3

--- 配置文件.h

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未被释放...

在gwan中声明externglobal变量的正确方法是什么?


简单解决方法:初始化您的变量。 userurl [0] ='\ 0' 另外,您的代码容易受到缓冲区溢出攻击(实际上,userurl 已经溢出),请注意这一点。 - Nagi
1个回答

0
每个 G-WAN 脚本都是单独编译的。因此,所有变量都是静态的(局部于此模块)- 您不能在不使用指针和原子操作的情况下共享它们。
为了简化全局变量的使用,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.cstream3.c说明了如何处理实际的程序。


在这种情况下,不需要跨多个实例调用进行持久化。我正在寻找特定实例的全局变量,并希望每次运行后该实例的全局变量被释放(垃圾回收)。 - stashfree
请定义“实例”(instance)。G-WAN持久指针仅适用于单个G-WAN实例(但可能通过多个线程并发运行脚本)。如果您需要一个变量在请求或连接的时间内保持不变,则使用US_REQUEST_DATA(并使用**gc_alloc()**分配上下文)。 - Gil
我不希望变量在请求或连接的时间内存活。我希望它在客户端关闭连接时被“释放”。Nagi建议的方法是否正确? - stashfree
1
看看stream[1,2,3].c的例子 - 他们只是这样做(使用G-WAN的垃圾回收器分配内存上下文来“分配并忘记”)。 - Gil

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接