Nano Hash - криптовалюты, майнинг, программирование

c read() вызывает ошибку неверного файлового дескриптора

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

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

Сделав НЕБОЛЬШУЮ домашнюю работу, прежде чем звать на помощь, я обнаружил:

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

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

.

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

30.06.2011

  • Я не уверен, почему чтение дает эту ошибку, потому что fd все еще должен быть открыт и действителен в этой точке кода. В любом случае, если вы не будете искать следующие 4096 байт, вы всегда будете читать первую часть файла. 30.06.2011

Ответы:


1

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

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


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

30.06.2011
  • read вообще не подвел. Это удалось с результатом 0 (EOF). Таким образом, значение errno не имеет абсолютно никакого отношения к read. 30.06.2011
  • Кстати, использование strace для отладки сделало бы все это сразу очевидным. 30.06.2011
  • Ха! Меньше или равно не заметил. 30.06.2011
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..