Для повышения эффективности grep и многие другие команды используют буферизованный ввод-вывод , то есть они читают большие блоки данных сразу ( а не, скажем, по одному символу за раз), и не выводить данные до тех пор, пока не будет накоплено определенное количество (вместо, скажем, записи строки за раз или символа за раз)
. ввод программы осуществляется с терминала (такого как ваш последовательный порт), операционная система оказывает программе услугу и возвращает строку за раз (программа может изменить это, поместив терминал в raw или неканонический режим ; большинство - нет).
И когда программа использует библиотеку stdio , стандартный вывод на терминал (в документации это называется «интерактивное устройство») по умолчанию буферизируется по строке, но вывод в файл или конвейер полностью буферизован.
Программа, использующая библиотеку stdio, может выбрать полную буферизацию, буферизацию строки или ее отсутствие, вызвав setvbuf
. Он также может вызвать fflush
для принудительной записи в любое время.
GNU grep принимает параметр - строчная буферизация
, который запускает следующий код в функции, выводящей соответствующую строку:
if (line_buffered)
fflush (stdout);
Соединение всех частей вместе:
С помощью этой команды:
cat /dev/ttyACM0 | grep "something" > essai
cat
будет читать строку за раз из / dev / ttyACM0
. После того, как он накопит несколько килобайт вывода, он выполнит запись в конвейер. Он будет повторять это до тех пор, пока чтение не вернет счетчик, равный нулю, или не завершится ошибкой (чего, вероятно, не произойдет, пока последовательный порт не отключится).
grep
будет читать несколько килобайт за раз из конвейера, и после того, как он накопит несколько килобайт вывода, он запишет в файл essai
fle. Он будет повторять это до тех пор, пока чтение не вернет счетчик, равный нулю, или не завершится ошибкой, что произойдет, если и когда процесс cat
завершится.
Таким образом, вы не увидите ничего в файле essai
, пока grep
не найдет совпадающих строк на несколько килобайт.
Для более быстрой записи вывода в файл вы можете указать GNU grep эту опцию:
grep --line-buffered < /dev/ttyACM0 > essai
Поскольку он читает из последовательного порта, он будет буферизован по строке, а - с буферизацией по строке
] также буферизирует строку вывода.
Обновление ядра с 4.10 до 4.17 устранило проблему. Вероятно, соответствующий драйвер для wifi-адаптера, не входил в состав старого релиза ядра.