Моя проблема в том, что моя программа зависает при использовании функции deflate() zlib.
Сначала я инициализирую свой z_stream следующим образом:
int setupGzipOutputStream(z_stream zStream) {
int zError;
zStream.zalloc = Z_NULL;
zStream.zfree = Z_NULL;
zStream.opaque = Z_NULL;
zError = deflateInit(&zStream, Z_COMPRESSION_LEVEL);
/* error handling code to test if zError != Z_OK... */
return EXIT_SUCCESS;
}
Я пытаюсь записать данные в свой z-поток с помощью следующей функции:
int compressDataToGzipOutputStream(unsigned char *myData, z_stream zStream, Boolean flushZStreamFlag) {
int zError;
int zOutHave;
FILE *outFp = stdout;
unsigned char zBuffer[Z_BUFFER_MAX_LENGTH] = {0};
zStream.next_in = myData;
zStream.avail_in = strlen(myData); /* myData is a null-terminated string */
do {
zStream.avail_out = Z_BUFFER_MAX_LENGTH;
zStream.next_out = zBuffer;
zError = deflate(&zStream, (flushZStreamFlag == kFalse) ? Z_NO_FLUSH : Z_FINISH);
/* error handling code to test if zError != Z_OK... */
zOutHave = Z_BUFFER_MAX_LENGTH - zStream.avail_out;
fwrite(zBuffer, sizeof(unsigned char), zOutHave, outFp);
fflush(outFp);
} while (zStream.avail_out == 0);
return EXIT_SUCCESS;
}
Я называю эти две функции (с упрощениями для того, чтобы задать этот вопрос) следующим образом:
z_stream zOutStream;
setupGzipOutputStream(zOutStream);
compressDataToGzipOutputStream(data, zOutStream, kFalse);
compressDataToGzipOutputStream(data, zOutStream, kFalse);
...
compressDataToGzipOutputStream(data, zOutStream, kTrue);
Затем я разбиваю структуру zOutStream на deflateEnd().
Значение kTrue на последнем шаге сжатия отправляет флаг Z_FINISH в deflate() вместо Z_NO_FLUSH.
Он висит на следующей строке:
zError = deflate(&zStream, (flushZStreamFlag == kFalse) ? Z_NO_FLUSH : Z_FINISH);
Затем я попытался использовать gdb. Я поставил break на этой строке, строке, где зависает программа.
В этой точке останова я вижу значения переменных zStream, flushZStreamFlag и других. Переменная zStream не является NULL, что я могу проверить с помощью print zStream, print zStream.next_in и т. д., которые заполнены интересующими меня данными.
Если я наберу next в gdb, то эта строка кода будет обработана, и весь процесс зависнет, что я проверяю с помощью операторов журнала до и после этой строки кода. Оператор журнала «до» отображается, а оператор «после» - нет.
У меня вопрос: почему здесь висит deflate()? Я неправильно инициализирую выходной поток? Не правильно используете deflate()? Я бился головой о стену, пытаясь решить эту проблему, но не повезло. Спасибо за любой совет, который у вас может быть.