hiredis redisCommand returns null 对于 Raspberry Pi 4 上的所有内容
hiredis redisCommand returns null for everything on Raspberry Pi 4
我有 Raspberry pi 4B,其中包含最新 raspbian 和更新的软件。我使用他们的安装说明从 github 源安装了 hiredis
库。当我尝试 运行 在普通计算机上遵循代码时,一切正常,但在 Raspberry Pi 4B redisCommand
上总是 returns null。当我使用 SET
命令时,数据库被更新。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hiredis/hiredis.h>
int main (int argc, char **argv) {
redisReply *reply;
redisContext *c;
c = redisConnect("127.0.0.1", 6379);
if (c->err) {
printf("error: %s\n", c->errstr);
return 1;
}
/* Set a key */
reply = redisCommand(c,"SET %s %s", "test", "Hello World");
printf("SET: %s\n", reply->str);
printf("error: %s\n", c->errstr);
freeReplyObject(reply);
redisFree(c);
return 0;
}
编译:gcc redis-test-rw.c -o redis-test-rw -g -lhiredis
运行:
pi@rpi:~ $ ./redis-test-rw
SET: (null)
error:
pi@rpi:~ $
这次调用后的Redis:
pi@rpi:~ $ redis-cli
127.0.0.1:6379> GET test
"Hello World"
127.0.0.1:6379>
pi@rpi:~ $
Redis MONITOR
命令:
127.0.0.1:6379> MONITOR
OK
1577573389.883836 [0 127.0.0.1:47228] "SET" "test" "Hello World"
我真的很困惑,因为在之前的 Raspberry pi 3B 中,我对 hiredis 没有任何问题,在计算机上也没有问题。
感谢提前!
编辑:
Valgrind 报告:
$ valgrind ./redis-test-rw
==21969== Memcheck, a memory error detector
==21969== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==21969== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==21969== Command: ./redis-test-rw
==21969==
==21969== Invalid read of size 8
==21969== at 0x4865004: ??? (in /usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so)
==21969== Address 0x49f964c is 36 bytes inside a block of size 42 alloc'd
==21969== at 0x4847690: malloc (vg_replace_malloc.c:309)
==21969== by 0x48907BB: redisvFormatCommand (in /usr/lib/arm-linux-gnueabihf/libhiredis.so.0.14)
==21969==
SET: (null)
error:
==21969==
==21969== HEAP SUMMARY:
==21969== in use at exit: 0 bytes in 0 blocks
==21969== total heap usage: 23 allocs, 23 frees, 1,913 bytes allocated
==21969==
==21969== All heap blocks were freed -- no leaks are possible
==21969==
==21969== For lists of detected and suppressed errors, rerun with: -s
==21969== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
编译此示例代码并验证结果:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hiredis/hiredis.h>
int main (int argc, char **argv) {
redisReply *reply;
redisContext *c;
c = redisConnect("127.0.0.1", 6379);
if (c->err) {
printf("error: %s\n", c->errstr);
return 1;
}
/* PINGs */
reply = redisCommand(c,"PING %s", "Hello World");
printf("RESPONSE: %s\n", reply->str);
printf("error: %s\n", c->errstr);
freeReplyObject(reply);
redisFree(c);
return 0;
}
应该打印:
RESPONSE: Hello World
error:
我有 Raspberry pi 4B,其中包含最新 raspbian 和更新的软件。我使用他们的安装说明从 github 源安装了 hiredis
库。当我尝试 运行 在普通计算机上遵循代码时,一切正常,但在 Raspberry Pi 4B redisCommand
上总是 returns null。当我使用 SET
命令时,数据库被更新。
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hiredis/hiredis.h>
int main (int argc, char **argv) {
redisReply *reply;
redisContext *c;
c = redisConnect("127.0.0.1", 6379);
if (c->err) {
printf("error: %s\n", c->errstr);
return 1;
}
/* Set a key */
reply = redisCommand(c,"SET %s %s", "test", "Hello World");
printf("SET: %s\n", reply->str);
printf("error: %s\n", c->errstr);
freeReplyObject(reply);
redisFree(c);
return 0;
}
编译:gcc redis-test-rw.c -o redis-test-rw -g -lhiredis
运行:
pi@rpi:~ $ ./redis-test-rw
SET: (null)
error:
pi@rpi:~ $
这次调用后的Redis:
pi@rpi:~ $ redis-cli
127.0.0.1:6379> GET test
"Hello World"
127.0.0.1:6379>
pi@rpi:~ $
Redis MONITOR
命令:
127.0.0.1:6379> MONITOR
OK
1577573389.883836 [0 127.0.0.1:47228] "SET" "test" "Hello World"
我真的很困惑,因为在之前的 Raspberry pi 3B 中,我对 hiredis 没有任何问题,在计算机上也没有问题。
感谢提前!
编辑: Valgrind 报告:
$ valgrind ./redis-test-rw
==21969== Memcheck, a memory error detector
==21969== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==21969== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==21969== Command: ./redis-test-rw
==21969==
==21969== Invalid read of size 8
==21969== at 0x4865004: ??? (in /usr/lib/arm-linux-gnueabihf/libarmmem-v7l.so)
==21969== Address 0x49f964c is 36 bytes inside a block of size 42 alloc'd
==21969== at 0x4847690: malloc (vg_replace_malloc.c:309)
==21969== by 0x48907BB: redisvFormatCommand (in /usr/lib/arm-linux-gnueabihf/libhiredis.so.0.14)
==21969==
SET: (null)
error:
==21969==
==21969== HEAP SUMMARY:
==21969== in use at exit: 0 bytes in 0 blocks
==21969== total heap usage: 23 allocs, 23 frees, 1,913 bytes allocated
==21969==
==21969== All heap blocks were freed -- no leaks are possible
==21969==
==21969== For lists of detected and suppressed errors, rerun with: -s
==21969== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
编译此示例代码并验证结果:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <hiredis/hiredis.h>
int main (int argc, char **argv) {
redisReply *reply;
redisContext *c;
c = redisConnect("127.0.0.1", 6379);
if (c->err) {
printf("error: %s\n", c->errstr);
return 1;
}
/* PINGs */
reply = redisCommand(c,"PING %s", "Hello World");
printf("RESPONSE: %s\n", reply->str);
printf("error: %s\n", c->errstr);
freeReplyObject(reply);
redisFree(c);
return 0;
}
应该打印:
RESPONSE: Hello World
error: