c read () вызвало ошибку неверного дескриптора файла - PullRequest
0 голосов
/ 30 июня 2011

Контекст для этого заключается в том, что программа в основном читает через файловый поток по 4 тыс. Блоков за раз, ища определенный паттерн.Он начинается с чтения в 4k, и если не находит там паттерн, он запускает цикл, который читает следующий блок 4k (промывайте и повторяйте, пока не будет найден EOF или паттерн).Во многих файлах код работает правильно, но некоторые файлы получают ошибки.

Приведенный ниже код явно сильно отредактирован, что, как я знаю, может раздражать, но оно включает ВСЕ строки, которые ссылаются на дескриптор файла или сам файл.Я знаю, что ты не хочешь поверить мне на слово, поскольку у меня одна проблема ...

Сделав НЕМНОГО домашнее задание, прежде чем взывать о помощи, я нашел:

  1. Дескриптор файла случается всегда = 6 (это также 6 для файлов, которые работают), и это число не изменяется в течение жизни выполнения.Не знаю, полезная это информация или нет.

  2. Вставляя операторы печати после каждой операции, которая обращается к дескриптору файла, я также обнаружил, что успешные файлы проходят следующий цикл "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);
}

.

Постарайтесь не беспокоиться о логике чтения шаблонов - все операции выполняются с буфером символов, а не с файлом, поэтому это не должно влиять на эту проблему.

1 Ответ

2 голосов
/ 30 июня 2011

EOF возвращает 0 (входит в if ... <= 0), но не устанавливает errno, в котором может быть устаревший код. </p>

Попробуйте проверить на 0 и отрицательные (ошибка, -1) значения отдельно.


Относительно "strace": я немного использовал его дома и на предыдущих работах. К сожалению, он не установлен в моей текущей рабочей среде. Это полезный инструмент, когда он доступен. Здесь я взял подход «давайте прочтем прекрасное руководство» (прочитанный человеком) с вопросником: -)

...