这是在我的 init.c :
中server_data_t **data = (server_data_t**)get_env(argv, US_SERVER_DATA);
data[0] = (server_data_t*)calloc(1, sizeof(server_data_t));
kv_t *channels = &data[0]->channels;
kv_t *users = &data[0]->users;
kv_init(channels, "channels.dat", 10*1024, 0, 0, 0);
kv_init(users, "users.dat", 10*1024, 0, 0, 0);
这些初始化仅用于测试瞳孔:
channel_t *channel = (channel_t*)calloc(1, sizeof(channel_t));
channel->name = strdup("Test channel");
channel->id = 1;
kv_item channel_item;
channel_item.key = (char*)&channel->id;
channel_item.klen = sizeof(u32);
channel_item.val = (char*)channel;
channel_item.in_use = 0;
kv_add(channels, &channel_item);
channel_t *channel2 = (channel_t*)calloc(1, sizeof(channel_t));
channel2->name = strdup("Test channel2");
channel2->id = 2;
kv_item channel_item2;
channel_item2.key = (char*)&channel2->id;
channel_item2.klen = sizeof(u32);
channel_item2.val = (char*)channel2;
channel_item2.in_use = 0;
kv_add(channels, &channel_item2);
kv_do(channels, NULL, sizeof(u32), test_proc, 0);
用户定义的进程kv_do进程:
static int test_proc(const kv_item *item, const void *ctx)
{
return 1;
}
在尝试访问所有项目后,kv_do测试进程启动无限循环后启动服务器段错误。它适用于列表中的一个项目,然后它只访问第一个项目并退出。我还可以使用kv_get逐个访问ID。
我发现了一个边缘情况,如果我的密钥是"测试频道"它可以使用两个项目。密钥长度是strlen(" Test Channel")然后下一个频道密钥是" Test Channel2"密钥长度与第一项密钥长度一样长。很混乱。
代码中的错误(指针等)或进程应该如何处理返回值1?
我知道gwan有时会遇到KVM问题,所以如果可能的话,我会用Ubuntu运行Oracle VM VirtualBox v5.0.24。
答案 0 :(得分:0)
kv.c
和persistence.c
G-WAN示例是否适合您?
如果其中任何一个崩溃,那么您可能正在使用不同步。带有最新gwan.h
可执行文件的G-WAN标头(./gwan
)。