Я пытаюсь понять, как работает gzip-функция glib.Поэтому я написал небольшую программу для имитации того, что мне нужно.мне нужно:
Мне нужно открыть и сохранить дескриптор файла, а когда я захочу, просто передать fd и открыть gzFile, используя dupped fd, а затем закрыть его.так что мой оригинальный fd остается открытым для дальнейшего чтения.
Я прошел руководство по lib здесь !
Там написано:
"Если вы хотитеоставьте fd открытым, используйте fd = dup (fd_keep); gz = gzdopen (fd, mode);. Дублированный дескриптор должен быть сохранен, чтобы избежать утечки, поскольку gzdopen не закрывает fd в случае сбоя. "
Я делаю то же самое, что и часть моего приведенного ниже кода, где я читаю один символ каждый раз и закрываю fd, чтобы я мог использовать его в будущем.
Вот мой код с gzFile, который делаетне работает:
#include <stdio.h>
#include <zlib.h>
#include <fcntl.h>
#include <string.h>
#include <sys/stat.h>
#include <sys/types.h>
int ouFd1;
int inpFd1;
int main( int argc, char ** argv )
{
// Open a file to write the data
inpFd1 = open("temp.txt", O_WRONLY | O_CREAT | O_TRUNC, S_IRUSR | S_IWUSR);
char* str = (char*)"Anil Prasad.";
gzFile gzfile = gzdopen(inpFd1, "wb9h");
int len = gzwrite(gzfile, &(str[0]), strlen(str));
printf("written length: %d\n", len);
gzclose(gzfile);
// open a file to read the data.
ouFd1 = open("temp.txt", O_RDONLY);
char b[1];
while (len > 0) {
int ouFd1_dup = dup(ouFd1);
gzFile gzFile_2 = gzdopen(ouFd1_dup, "rb");
int r = gzread(gzFile_2, &(b[0]), 1);
printf("Character : %c\n", b[0]);
len--;
gzclose(gzFile_2);
}
fsync(ouFd1);
close(ouFd1);
}
Вывод этого:
Символ: A
Символ: A
Символ: A
Символ: A
Символ: A
Символ: A
Символ: A
Символ: A
Символ: A
Символ: A
Символ: A
Символ: A
Может ли кто-нибудь помочь мне понять, почему смещение не перемещается после того, как я gzread () ?
Или он сбрасывается, когда я делаюng gzclose (gzFile_2); ?
Я пробовал также сдвигать смещение, например:
while (len > 0) {
int ouFd1_dup = dup(ouFd1);
gzFile gzFile_2 = gzdopen(ouFd1_dup, "rb");
int r = gzread(gzFile_2, &(b[0]), 1);
gzseek(gzFile_2, 1, SEEK_CUR);
printf("Character : %c\n", b[0]);
len--;
gzclose(gzFile_2);
}
Но результаты остаются такими же!
Может кто-нибудь помочь мне с этим?