首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >GWAN密钥-值持久多存储

GWAN密钥-值持久多存储
EN

Stack Overflow用户
提问于 2014-04-26 01:50:03
回答 2查看 356关注 0票数 3

我想在持久模式下记录键值,但是当我想使用两个或更多不同的商店时,它就不工作了。

这是我的剧本:

代码语言:javascript
运行
复制
    ...
    typedef struct{
       kv_t  *kv;
       char  *name;
    } kv_data;

    int main(int argc, char *argv[])
    {
       kv_data **data = (kv_data**)get_env(argv, US_SERVER_DATA);
       if(!data[0]){
          data[0] = (kv_data*)calloc(1, sizeof(kv_data));
          if(!data[0]){
             return 500;
          }
          kv_t users;
          kv_init(&users, "users", 10, 0, 0, 0);
          data[0]->kv = &users;

          kv_item item;
          item.key = "pierre";
          item.klen = sizeof("pierre") - 1;
          item.val = "pierre@example.com";
          item.flags = 0;
          kv_add(data[0]->kv, &item);

          data[0]->name = strdup("users");
       }
    ...

这个错误在第15行中使用kv_init()函数。

例如,我希望使用data->kv在“ use ”存储中读取和记录值,并使用data 1->kv其他存储中读取和记录值.

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-04-27 11:01:56

我只是附加了一个kv存储,其中包含了我需要的所有kv存储到持久性指针。G-广域网kv速度快,加上记录次数少,不应损害性能.

代码语言:javascript
运行
复制
  xbuf_t *reply = get_reply(argv);
  kv_t **kv_db = (kv_t **)get_env(argv, US_VHOST_DATA);

  if (!kv_db[0])
  {
     kv_db[0] = (kv_t*) malloc(sizeof(kv_t));

     if (!kv_db[0])
     {
        puts("Could not allocate memory for the v-host kv store");
        return 500;
     }

     kv_init(kv_db[0], "kv_db", 10, 0, 0, 0);
  }

  kv_t *blog_db = (kv_t *) kv_get(kv_db[0], "blog_db", 7);

  if (blog_db)
  {
     xbuf_cat(reply, "Blog already installed. GTFO.");
     return 200;
  }

  blog_db = (kv_t *) malloc(sizeof(kv_t));
  kv_init(blog_db, "blog_db", 0, 0, 0, 0);

  if (!blog_db)
  {
     puts("Could not allocate memory for the blog kv store");
     return 500;
  }

  _KV_ADD(kv_db[0], item, blog_db->name, blog_db, 0);

(_KV_ADD是一个自定义宏)

票数 1
EN

Stack Overflow用户

发布于 2014-04-26 11:54:07

约翰,

你的问题来自于在指针上玩指针的困难。我们可以修复这段代码,但由于它的复杂性,它可能会在稍后的脚本中中断。

从长远来看,应该使用更简单的解决方案来避免bug。

附加在US_SERVER_DATA上的结构可以变得更简单:

代码语言:javascript
运行
复制
typedef struct
{
   char *name;
   kv_t *kv_1;
   kv_t *kv_2;
   void *callback;
   u32   current_time;
}

这就是方法:使用calloc(sizeof(my_struct));分配内存,并将此结构附加到您的US_SERVER_DATA指针。

然后,如果您在G处理程序init()调用(或在gwan/main.c维护脚本中,甚至在最近添加的gwan/init.c脚本中)中完成所有这些操作,您将拥有独占访问(一个线程正在进行初始化),并且您将能够根据需要攻击G存储(和其他对象)。

如果以后G或处理程序正在修改这些结构指针,那么您必须为指针本身使用锁、自旋锁等或原子变量。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23305661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档