这在我的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);这些初始化只用于测试puproses:
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“),然后下一个通道键是"Test Channel2”,其中密钥长度和第一个项键长度一样长,那么它可以与两个项一起工作。很让人困惑。
是代码中的错误(指针等),还是进程应该如何与返回值1一起工作?
我知道gwan有时在KVM方面有问题,所以如果可能的话,我将使用Ubuntu运行Oracle v5.0.24。
发布于 2016-09-06 04:14:00
kv.c和persistence.c G的例子对你有用吗?
如果其中任何一个崩溃,那么您可能正在使用不同步。G (gwan.h)具有最近的./gwan可执行文件.
https://stackoverflow.com/questions/39337034
复制相似问题