[英]Redis module RESTORE command call
我想将序列化的密钥从文件还原到模块中的redis内存。
这是代码:
int Unarchive_RedisCommand(RedisModuleCtx *ctx, RedisModuleString **argv, int argc) {
if (argc != 2) {
RedisModule_WrongArity(ctx);
} else {
RedisModuleString *keyName = argv[1];
long long unarchiedKeys = 0;
const char *filename = RedisModule_StringPtrLen(keyName, NULL);
FILE *f = fopen(filename, "r");
if (f != NULL && access(filename, F_OK) != -1) {
struct stat info;
if (stat(filename, &info) != 0) {
RedisModule_ReplyWithError(ctx, "Error during file read");
}
size_t valueSize = info.st_size * sizeof(char);
char *keyValue = RedisModule_Alloc(valueSize);
fread(&keyValue, (size_t) info.st_size, 1, f);
fclose(f);
RedisModule_ReplyWithCallReply(ctx, RedisModule_Call(ctx, "RESTORE", "slbc", keyName, 0, keyValue, "REPLACE"));
remove(filename);
unarchiedKeys++;
}
RedisModule_ReplyWithLongLong(ctx, unarchiedKeys);
}
return REDISMODULE_OK;
}
当我运行此命令时,执行行RedisModule_ReplyWithCallReply(ctx, RedisModule_Call(ctx, "RESTORE", "slcc", keyName, 0, keyValue, "REPLACE"));
会收到SIGSEGV (Segmentation fault)
RedisModule_ReplyWithCallReply(ctx, RedisModule_Call(ctx, "RESTORE", "slcc", keyName, 0, keyValue, "REPLACE"));
谁能帮我解决这个问题?
提前致谢。
段错误通常是由取消引用空指针引起的,该空指针通常指向一个不属于进程地址空间的地址。 最好打个赌,这是您的问题。 通常,看起来您在使用变量之前已经完成了相当不错的验证变量,但有一些值得注意的例外:
ctx
(除非argc
计数错误,或者stat
!= 0)在对RedisModule_ReplyWithCallReply
的调用中。 使用前应检查它是否不为null。 RedisModule_Call
的返回值作为另一个函数的参数调用时,无法检查该返回值。 并且根据此API文档 ,此函数针对错误的回复类型返回NULL。 建议删除对RedisModule_Call
的嵌入式调用,以便在将其作为参数传递给RedisModule_ReplyWithCallReply()
之前,可以测试它的返回值。
RedisModuleCallReply *reply = RedisModule_Call(ctx, "RESTORE", "slbc", keyName, 0, keyValue, valueSize, "REPLACE");
if(!reply)
{
// handle error;
}
else
{
RedisModule_ReplyWithCallReply(ctx, reply);
}
编辑:
另一想,这行:
fread(&keyValue, (size_t) info.st_size, 1, f);
^//not needed
应该:
fread(keyValue, (size_t) info.st_size, 1, f);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.