Контекст для этого заключается в том, что программа в основном читает файловый поток, фрагменты по 4 КБ за раз, ища определенный шаблон. Он начинает с чтения в 4k, и если не находит там шаблон, он запускает цикл, который читает в следующем фрагменте 4k (промывает и повторяет, пока не будет найден EOF или шаблон). На многих файлах код работает правильно, но в некоторых файлах возникают ошибки.
Приведенный ниже код, очевидно, сильно отредактирован, что, как я знаю, может раздражать, но он включает ВСЕ строки, которые ссылаются на дескриптор файла или на сам файл. Я знаю, ты не хочешь верить мне на слово, потому что у меня проблемы...
Сделав НЕБОЛЬШУЮ домашнюю работу, прежде чем звать на помощь, я обнаружил:
Дескриптор файла всегда = 6 (он также равен 6 для работающих файлов), и это число не меняется в течение всего срока выполнения. Не знаю, полезная информация или нет.
Вставляя операторы печати после каждой операции, которая обращается к дескриптору файла, я также обнаружил, что успешные файлы проходят следующий цикл «открыть-прочитать-закрыть-закрыть» (т. е. шаблон был найден в первых 4 КБ). Неудачные файлы идут « открыть-читать-читать ОШИБКА (неверный файловый дескриптор)-закрыть». Таким образом, нет преждевременного закрытия, и первое чтение выполняется успешно, но второе чтение вызывает ошибку Bad File Descriptor.
.
int function(char *file)
{
int len, fd, go = 0;
char buf[4096];
if((fd = open(file, O_RDONLY)) <= 0)
{
my_error("Error opening file %s: %s", file, strerror(errno));
return NULL;
}
//first read
if((len = read(fd, buf, 4096)) <= 0)
{
my_error("Error reading from file %s: %s", file, strerror(errno));
close(fd); return NULL;
}
//pattern-searching
if(/*conditions*/)
{
/* we found it, no need to keep looking*/
close(fd);
}
else
{
//reading loop
while(!go)
{
if(/*conditions*/)
{
my_error("cannot locate pattern in file %s", file);
close(fd); return NULL;
}
//next read
if((len = read(fd, buf, 4096)) <= 0) /**** FAILS HERE *****/
{
my_error("Error reading from file, possible bad message %s: %s",
file, strerror(errno));
close(fd); return NULL;
}
if(/*conditions*/)
{
close(fd);
break;
}
//pattern searching
if(/*conditions*/)
{
/* found the pattern */
go++; //break us out of the while loop
//stuff
close(fd);
}
else
{
//stuff, and we will loop again for the next chunk
}
} /*end while loop*/
}/*end else statement*/
close(fd);
}
.
Постарайтесь не беспокоиться о логике чтения шаблонов - все операции выполняются с символьным буфером, а не с файлом, поэтому это не должно влиять на эту проблему.
read
вообще не подвел. Это удалось с результатом 0 (EOF). Таким образом, значениеerrno
не имеет абсолютно никакого отношения кread
. 30.06.2011strace
для отладки сделало бы все это сразу очевидным. 30.06.2011