Собственно имеется у меня малинка c Raspbian'ом, которая тащит некое оборудование и получает с него данные. Данные пишутся в текстовые файлы. Сбор данных осуществляется самописной программой на С/С++. Кроме того, программа тянет из внешней сетевой базы данные и тоже пишет их в файлы. Файлы тянутся программой, написанной на Фортране. Далее эти данные подхватывают скрипты, рисуют красивые графики и т.п..
И в обеих программах в случайные моменты времени наблюдается одинаковый баг - вместо ожидаемой строки в файл падает пачка нулевых байтов длинной с ожидаемую строку (+/- один символ), а потом уже пишется ожидаемая строка. Соответственно скрипты находят в строке нули и графики резко становятся некрасивыми.
Соответственно вопрос: что вообще тут происходит? Ошибка не в программах, поскольку они написаны на разных языках и не имеют ничего общего. Ошибка не в исходных данных, поскольку они берутся из принципиально разных источников. Операционная система? Но где и как она влияет на запись в файлы?
Непонятна ваша уверенность в непогрешимости самописного софта. Вряд ли железо может приводить к такому багу, равно как и ОСь. Я бы искал ошибку в софте, в протоколе передачи.
Я понимаю, что в самописных программах могут быть ошибки, но абсолютно одинаковая ошибка в двух разных программах написанных на разных языках и берущих и выводящих данные в разные файлы? Т.е. программы между собой связаны только тем, что работают на одной системе. Даже скрипты, читающие выходные данные программ разные (что не обязательно, но сложилось исторически).
А протоколы... Оборудование передаёт данные через стандартный драйвер FTDI и данные на входе в программу контролируются. Если бы устройство посылало некорректные данные, то это я это бы заметил. Да и в любом случае это повлияло бы на содержание но не на формат выходной строки. Внешняя же база подмонтирована просто как папка и программа читающая её состоит буквально из десятка строк. Чтение состоит в распарсивании бинарных файлов. Данный процесс был уже отработан в десятке других программ и подобных накладок никогда не было.
До этого всё это дело крутилось на х86 ноутбуке под Windows. Программы были те же, только откомпилированные Visual Studio и Intel Fortran (сейчас же gcc и gfortran соответственно). Работало долго. Подобных проблем с выводом в файлы замечено не было.
Система Raspbian, ядро 3.10.25+
Файловая система ext4 с вкраплением vfat для раздела с конфигами самого raspberry и cifs для подключённой в виде папки внешней базы данных.
Системная кодировка koi-8. Программы соответственно используют системную кодировку.
@WildHorn Вообще странно. Только вчера похожую систему отлаживал. Тоже Малина, тоже дебиан. Источник клал в папку файлик а мой велосипед забирал ее. По сути аналог команды tail -f _file_, написан велосипед на питоне. Есть небольшая латентность связанная с буферезированием самой системой, но чтобы данные приходили битые.... Такого не наблюдается. Работает уже 34 часа багов не замечено.
Попробуйте провести эксперимент с tail -f * в момент создания и записи файлов, будут ли наблюдаться нулевые строки.
Просто если это было бы железо, то врядли сама система могла бы функционировать с такой багой. Скорее особенности буферизирования и кеширования fs тут имеет место быть.
Обычный ряд мер, если подозрение на железо(сортированный по порядку попытки):
обновить фирмварю платы
замкнуть полифузы
поставить более надежный блок питания
заменить карточку памяти
заэкранировать конструктив
Это понятно, но я сомневаюсь, что железо может так влиять на запись файлов. Разве что карточка битая. Скорее дело в особенностях ОС, но я недостаточно опытен в линуксе для того, чтобы осознать корень проблем.