Что означает в Unix фраза «Всё есть поток байтов»?

Что означает в Unix фраза «Всё есть поток байтов»?

Я новичок в Linux и, изучая файловую систему, я довольно часто сталкиваюсь с фразой «Все есть файл". Я вижу ответ на этот вопрос.здесьно я все еще не могу понять концепцию. В ответе упоминается, что именно "Все есть поток байтов"

Я не понимаю, что имеется в виду, когда говорят, что монитор/клавиатура и т. д. представлены как "поток байтов". Может кто-нибудь помочь мне визуализировать это?

решение1

"Всё есть файл" - это лозунг, так сказать. Мем, если хотите. Это не совсем так.

Очевидно, что аппаратные устройства не являются фактическими файлами в том смысле, в каком это hello.txtбыло бы в файловой системе ext4. Многие из них даже не имеют никакого отношения к устройствам хранения.

Но даже если не все такфайл, ряд вещей может бытьдоступ осуществляется как если быони были файлами, по крайней мере, в какой-то степени. То есть, у них есть имя в дереве файловой системы, и для них можно использовать read()системные write()вызовы и. Последнее особенно важно, если мы рассматриваем смысл того, что «все есть поток байтов», поскольку эти вызовы обращаются к потокам байтов.

Поскольку одни и те же системные вызовы работают для обычных файлов, необработанных дисковых устройств, терминалов, сетевых сокетов и каналов, один и тот же набор инструментов может использоваться с каждым из них. Например, echo fooработает одинаково независимо от того, куда подключен вывод. Это может упростить реализацию утилиты и облегчить ее применение для новых целей. Оболочке или другой утилите командной строки не нужно делать ничего особенного, чтобы подключиться через канал или сокет к серверу SSH и получить к ним доступ по сети. (Хотя для интерактивных сеансов SSH создает псевдотерминал, поэтому он не сильно отличается от локального сеанса.)

Кроме того, когда в файловой системе присутствует несколько вещей, их можно перечислить lsи получить к ним доступ с помощью catперенаправлений оболочки ( echo foo > ...). Это может быть полезно для доступа к специальным файлам в скриптах /procили /sysиз них, без необходимости в специальном двоичном файле для выполнения менее распространенного системного вызова.

Все еще невсеэто файл или поток байтов, и для вещей, которые являются таковыми, не все можно сделать с помощью read()и write(). UDP-сокеты не являются потоками байтов, поскольку они передают многобайтовые датаграммы с фиксированными размерами. (Хотя read()и write()все еще работают с ними, просто немного по-другому.) Некоторые действия все еще необходимо выполнять с помощью системного ioctl()вызова, а операции ioctl специфичны для устройств. В Linux сетевые устройства не имеют имен в файловой системе.

См. также, например

решение2

Все в системе UNIX/Linux можно представить как некое устройство ввода или вывода.

Диск является и тем, и другим - вы либо записываете на него поток байтов, либо считываете с него поток байтов. Клавиатура является устройством ввода - вы считываете поток байтов с клавиатуры.

Интерпретация этого потока байтов зависит от программы, которая в данный момент использует клавиатуру, будь то оболочка, пользовательская программа, системная программа или что-то еще. Терминал — это просто поток байтов, записываемых в STDOUT или STDERR.

Аналогия несколько нарушается, когда вы говорите о графических консолях, но в каждом окне терминала она сохраняется. Это окно терминала — это просто что-то, что ждет, когда оболочка/программа отправит ему байты, и отображает эти байты в виде текста или других символов ASCII для пользователя.

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

Связанный контент