Запуск блокирующей подписки, как показано ниже, останавливает программу на redisGetReply
(источник: hiredis # конвейерная)
void subscribe (std::string& key, Subscriber* subscriber)
{
void* reply = redisCommand (redis, "SUBSCRIBE %s", key.c_str ());
freeReplyObject (reply);
while (redisGetReply (redis, &reply) == REDIS_OK)
{
subscriber -> notify ();
freeReplyObject (reply);
}
}
Я думал, что, призывая redisFree
(через обработку сигнала) сокет будет закрыт и redisGetReply
вернулся, как упоминалось в hiredis # чистящих вверх, вместо этого он вызывает нарушение доступа к памяти.
Хорошо, ничего страшного. Мне удалось просто закрыть дескриптор файла, который используется hiredis, вызвав …
close (redis -> fd);
… а также redisGetReply
возвращается правильно.
Кроме того, можно отправить QUIT
команда и блокировка подписки возвращается.