Поскольку вы отметили этот вопрос с помощью awk
, почему бы просто не использовать awk
?
$ awk '
BEGIN{RS=FS="\\W+"}
$0==t{printf("%s:%s\t%s %s\n", FILENAME, FNR, t, $0)}
{t=$0}
' *.txt
highlander_typo.txt:6 one one
jefferson_typo.txt:3 has has
jefferson_typo.txt:29 and and
jefferson_typo.txt:42 be be
kylie_minogue.txt:3 la la
Я не сохранил новую строку в jefferson_typo.txt
, потому что он не
визуально полезен для меня, но вы можете настроить его по своему вкусу.
Драйвер устройства — это просто «посредник» между операционной системой и Устройство.
Да, примерно так.
Драйверы устройств представляют собой «черные ящики», которые переводят вызовы стандартного программирования в специфичные для устройства операции аппаратного компонента.
Таким образом, программе не нужно знать внутреннюю работу конкретной аппаратной части; это специальный драйвер устройства, который будет выполнять сопоставление прозрачным образом, позволяя программе «общаться» с оборудованием.
Они собираются отдельно от ядра и активируются (как модули, загруженные в ядро) по мере необходимости.
Очень кратко:
Самая важная особенность драйвера устройства заключается в том, что он работает в пространстве ядра с теми же разрешениями, что и ядро, и, следовательно, может напрямую обращаться к оборудованию. Приложениям (обычно )этого делать не разрешается.
Таким образом, вы можете думать о драйверах устройств как о частях ядра, которые организуют доступ к определенному оборудованию ("устройству" ).
Приложение может взаимодействовать с ядром на различных уровнях :Из более высоких абстракций (, например. файловая система )для средних абстракций (блочное устройство )для действительно низкоуровневых абстракций (некоторые файлы в /proc/
или /sys
, некоторые ioctls
в устройствах в/dev
). Таким образом, низкоуровневые взаимодействия иногда будут напрямую обращаться к драйверу устройства, есть только очень тонкий слой, на котором ядро перенаправляет вызов к драйверу устройства. Таким образом, «приложение не может напрямую взаимодействовать с драйвером устройства, это может делать только операционная система» является как бы истинным, а также ложным.
Кроме того, в ядре есть много уровней абстракции, подобных тому, который вы описываете на своем рисунке («сообщения, которые отправляет ОС, одинаковы, драйвер устройства использует разные сообщения для связи с оборудованием ). Например, блочный уровень получает сообщения одного типа, но передает их другим блочным устройствам Уровень USB получает сообщения одного типа, но может использовать разные хост-контроллеры USB и т. д.
Таким образом, картина намного сложнее, в ядре есть уровни и подсистемы, а драйверы устройств, которые фактически взаимодействуют с оборудованием, находятся в нижней части этой иерархии. Чтобы еще больше запутать ситуацию, драйверы устройств и другие уровни представлены в виде модулей (для Linux ). Если вы наберете lsmod
,вы можете видеть, какие модули активны, и какой модуль использует какие другие модули.
Кроме того, печать — очень плохой пример; большая часть специфической обработки принтера -происходит в пользовательском пространстве, а не в драйвере устройства.
Все Windows, Linux и MacOS следуют этим принципам, но детали сильно различаются.
Это поможет?
Редактировать:
Сегодня печать в Linux обычно выполняется чашками . В Cups есть набор программ, которые могут отображать документы для различных принтеров. Все эти программы берут файл (документа в формате pdf/postscript/... )и преобразуют его в другой файл в формате, понятном принтеру. Все это происходит вне ядра, потому что ни для чего из этого не требуется доступ к реальному оборудованию. Он просто читает и записывает файлы. Только самая последняя часть, когда преобразованные данные отправляются на принтер, использует ядро. И затем он может использовать различные пути, даже для одного и того же типа принтера :через сеть, через USB, через последовательное соединение и т. д. И эта последняя часть часто не зависит от конкретного принтера.
Таким образом, в Linux на самом деле нет -конкретных драйверов устройств для подавляющего большинства принтеров. (Для некоторых принтеров может потребоваться один ).