Redis: команда SET, когда данные начинаются с символа новой строки - PullRequest
0 голосов
/ 16 декабря 2011

Я использую Redis в программе на C, которую я пишу (с привязкой hiredis C).

Вот мой код:

void insert(redisContext* c,char* buf){
        static redisReply *reply;
        const char* hash="asdf";
        char* cmd=(char*)malloc((strlen("SET ")+strlen(hash)+strlen(" ")+CHUNKSIZE)*sizeof(char));

        //hash=getHash(buf);
        memcpy(cmd,"SET ",(size_t)strlen("SET "));
        memcpy(cmd+strlen("SET "),hash,(size_t)strlen(hash));
        memcpy(cmd+strlen("SET ")+strlen(hash)," ",(size_t)strlen(" "));
        memcpy(cmd+strlen("SET ")+strlen(hash)+strlen(" "),buf,(size_t)CHUNKSIZE);

        fwrite(cmd,strlen("SET ")+strlen(hash)+strlen(" ")+CHUNKSIZE,sizeof(char),stdout);
        printf("\n\n\n\n\n\n");
        reply=(redisReply*)redisCommand(c,cmd);
        freeReplyObject(reply);

        free(cmd);
}

Как видите, cmdвыглядит следующим образом: SET asdf xxx, где xxx имеет длину 512 байт (двоичные данные).

Проблема возникает, когда строка двоичных данных начинается с '\ n'.Я получаю сообщение об ошибке (ошибка сегментации).

У кого-нибудь есть идеи?

Заранее большое спасибо,

Ответы [ 2 ]

1 голос
/ 03 июля 2012

hiredis документы:

Когда вам нужно передать двоичные безопасные строки в команде, можно использовать спецификатор% b. Вместе с указателем на строку требуется аргумент длины size_t строки:

reply = redisCommand(context, "SET foo %b", value, valuelen);
1 голос
/ 16 декабря 2011

Я использую код, который вы опубликовали, и не получил никаких сбоев.Мой код:

#define CHUNKSIZE 512
char asd[CHUNKSIZE];
memset(asd, 0, 512);
asd[0] = '\n';
insert(c, asd);

Попробуйте запустить приложение с valgrind, которое, вероятно, даст вам лучшее представление о том, что не так, до его сбоя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...