Контекст для этого заключается в том, что программа в основном читает через файловый поток по 4 тыс. Блоков за раз, ища определенный паттерн.Он начинается с чтения в 4k, и если не находит там паттерн, он запускает цикл, который читает следующий блок 4k (промывайте и повторяйте, пока не будет найден EOF или паттерн).Во многих файлах код работает правильно, но некоторые файлы получают ошибки.
Приведенный ниже код явно сильно отредактирован, что, как я знаю, может раздражать, но оно включает ВСЕ строки, которые ссылаются на дескриптор файла или сам файл.Я знаю, что ты не хочешь поверить мне на слово, поскольку у меня одна проблема ...
Сделав НЕМНОГО домашнее задание, прежде чем взывать о помощи, я нашел:
Дескриптор файла случается всегда = 6 (это также 6 для файлов, которые работают), и это число не изменяется в течение жизни выполнения.Не знаю, полезная это информация или нет.
Вставляя операторы печати после каждой операции, которая обращается к дескриптору файла, я также обнаружил, что успешные файлы проходят следующий цикл "open-read-close-close "(то есть шаблон был найден в первых 4K). Неудачные файлы переходят в" open-read-read ERROR (Bad File Descriptor) -close. "Таким образом, преждевременное закрытие не выполняется, и первое успешное чтение успешно завершается, но второе чтение вызывает ошибку 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);
}
.
Постарайтесь не беспокоиться о логике чтения шаблонов - все операции выполняются с буфером символов, а не с файлом, поэтому это не должно влиять на эту проблему.