Я новичок в 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 вы поймете, что это упрощение иногда неверно, но оно все еще имеет ценность для тех, кто только знакомится со средой.