fgets vs. std::fgets - fgets пропускает строки

У меня есть следующий код: (cpp14)

static int const max_len = 1000;
FILE* m_in_log = NULL;
FILE* m_log = NULL;
...

...


bool readLine(char* line, int max_len) 
    if(!fgets(line, max_len, m_in_log)) {
        return false;
    }

    fputs(line, m_log);
    fflush(m_log);
    return true;
}

Он должен читать строку за строкой из файла журнала, а затем записывать его, как есть, в другой файл журнала.

Это часть сложной многопоточной системы, которая работает в Linux и m_in_log вход FIFO.

Когда я запускаю этот код несколько раз, что-то пропускает строки:

предполагать m_in_log содержит следующие строки:

AAA

ВВВ

CCC

DDD

EEE

но выходной файл журнала я вижу только

AAA

EEE

то есть fgets пропустил чтение 3 строк в середине (я точно знаю, что эти строки были отправлены в FIFO, потому что мы также делаем tee из этого FIFO в другой файл, и в этом файле записаны все 5 строк).

Поработав с этим вопросом в течение некоторого времени (без какой-либо удачи), я решил использовать std методы:

fgets => std::fgets

fputs => std::fputs

fflush => std::fflush

и кажется, что проблемы решены.

Не могли бы вы объяснить, почему с помощью std методы могут решить эту проблему?

1 ответ

Решение

Как предположил Реми Лебо, на самом деле нет разницы между fgets а также std::fgetsи после запуска кода с std::fgets в течение ~20 часов проблема воспроизводилась.

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

Спасибо вам всем!

Другие вопросы по тегам