【问题标题】:How do I create a G-Wan global variable properly?如何正确创建 G-Wan 全局变量?
【发布时间】: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 已溢出),因此请注意这一点。

标签: global-variables g-wan object-persistence


【解决方案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.cstream3.c 等几个示例说明了如何进行实际程序。

【讨论】:

  • 在这种情况下不寻找跨多个实例调用的持久性。我正在寻找该特定实例的全局变量,并希望在每次运行后释放(gc)该实例的全局变量
  • 请定义“实例”。 G-WAN 持久指针用于单个 G-WAN 实例(但可能并发脚本通过多个线程运行)。如果您需要一个变量在请求或连接期间存在,请使用 US_REQUEST_DATA(并使用 gc_alloc() 分配上下文)。
  • 我不希望变量在请求或连接期间仍然存在。我希望它在客户端关闭连接时被“释放”。 Nagi 建议的正确方法是什么?
  • 查看 stream[1,2,3].c 示例 - 他们就是这样做的(使用 G-WAN 的垃圾收集器将内存上下文分配给“alloc and forget”)。
猜你喜欢
  • 2017-05-31
  • 2014-11-29
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-12
相关资源
最近更新 更多