В 1970-х годах у нас были аппаратные терминалы CUI.
Теперь в моем Linux-компьютере я вижу семь эмуляторов терминала, где графический интерфейс занимает седьмой эмулятор терминала (Ctrl+Alt+F7).
Например, это мой первый эмулятор терминала (Ctrl+Alt+F1)
$ tty
/dev/tty0
При >cat
нажатии ENTER в пользовательском пространстве cat
процесс ожидает stdin
получения ввода из /dev/tty0
файла. Я не смог просмотреть /dev/tty0
файл ни в одном редакторе.
Оба stdin
процесса работают с stdout
файлом .cat
/dev/tty0
Вопрос:
Используя какой-либо редактор, можно ли /dev/tty0
получить доступ к этому файлу терминала в пространстве пользователя?
решение1
Вы постоянно обращаетесь к файлу терминала. Но это не делает того, что вы, вероятно, думаете.
Когда вы записываете в файл на диске, а затем позже читаете из него, то, что вы читаете, это то, что вы написали. Это не относится к специальным файлам, таким как терминалы. Файл — это то, что можно записывать и читать¹; связь между тем, что записывается, и тем, что читается, зависит от природы файла. В случае файла символьного устройства обычно вообще нет никакой связи.
Файлы терминала соединяют две сущности, которые играют разные роли: сам терминал и приложение, которое хочет взаимодействовать с пользователем. Терминал может быть либо частью оборудования, представленного ядром, либо эмулятором терминала, который является процессом. Когда приложение записывает данные, терминал может их прочитать (и обычно отображает их пользователю каким-либо образом); когда приложение считывает данные, данные поступают с терминала (обычно это ввод от пользователя).
В вашем случае приложением последовательно является shell, cat, editor и т. д. Редактор может попытаться прочитать из терминала, но в этом случае он ждет вашего ввода, и он может или не может правильно отреагировать на конец ввода (о чем вы сигнализируете, нажимая Ctrl+D в начале строки). Еще раз, чтение из терминала не даст вам того, что быловыходк терминалу.
В случае консоли данные, которые записываются на терминал, рисуются на экране. В случае с консолями Linux текст, отображаемый на, /dev/tty1
может быть прочитан обратно с устройства/dev/vcs1
до тех пор, пока оно остается видимым (то есть вы получаете только то, что отображается на экране, плюс то, что все еще доступно при прокрутке назад; все, что недоступно при прокрутке назад, теряется навсегда).
Обратите внимание, что это возможность, предлагаемая интерфейсом терминала Linux. Терминал может просто рисовать пиксели и забыть текст. Большинство эмуляторов терминала не предоставляют никакой подобной возможности.
¹ Большинство файлов на самом деле такие, но не все. Каталоги не могут быть записаны через обычный интерфейс, и на многих вариантах unix их также нельзя прочитать. Некоторые устройства не поддерживают чтение или запись, только ioctl
.
решение2
Да, однако файл терминала не является обычным файлом.
Если вывести список расширенных свойств файла терминала, вы увидите:
$ ls /dev/tty1 -lah
crw--w---- 1 root tty 4, 0 Apr 6 13:07 /dev/tty1
обратите внимание, что первый символ в разделе разрешений — это буква «c», это указывает на то, что файл является специальным символьным устройством. Напротив, обычный файл будет иметь «-», каталог — «d», специальное блочное устройство — «b», символическую ссылку — «l» и сокет домена unix — «s».
Важно отметить, что в системах Unix, таких как Linux, файловая система на самом деле больше похожа на пространство имен для взаимодействия с объектом ядра, где вы можете давать имена различным объектам ядра, чтобы на них можно было ссылаться однозначно из разных частей системы. Эти объекты ядра — это не просто обычные файлы, которые поддерживаются постоянным хранилищем, но и такие вещи, как аппаратные устройства или сокеты и т. д.
Специальное символьное устройство — это объект ядра, который взаимодействует с пользовательским пространством, считывая и записывая потоки символов. Доступ к ним осуществляется следующим образом:read()
иwrite()
системный вызов.
Например, на моей машине с помощью Ctrl+Alt+F1 (на моей машине это /dev/tty1, а не tty0) я могу считывать все, что вводится на виртуальную консоль, используя программу, которая использует системный вызов, read()
например cat
:
- В графическом эмуляторе,
sudo cat /dev/tty1
- Переключитесь на эмулятор виртуальной консоли с помощью Ctrl+Alt+F1
- Введите что-нибудь в эмулятор виртуальной консоли.
- Переключитесь обратно в графический интерфейс с помощью Ctrl+Alt+F7.
- В графическом эмуляторе я бы увидел все, что я набрал в эмуляторе виртуальной консоли, как вывод
cat
С другой стороны, я также мог бы отображать символы в виртуальной консоли, используя программу, которая использует write()
системный вызов, например tee
:
- В графическом эмуляторе,
echo "hello world" | sudo tee /dev/tty1
- Переключитесь на эмулятор виртуальной консоли с помощью Ctrl+Alt+F1
- В эмуляторе виртуальной консоли я бы увидел "hello world"
Большинство обычных текстовых редакторов фактически откажутся открывать нестандартные специальные файлы, поскольку они запрограммированы на проверку типа файла и отказываются редактировать нестандартные файлы. Это сделано для предотвращения «несчастных случаев», поскольку нет смысла редактировать специальные устройства в обычных текстовых редакторах. Кроме того, большинство обычных текстовых редакторов также на самом деле не просто вызывают write()
существующий файл, а вместо этого записывают в новый файл и rename()
файл подкачки, чтобы заменить старый файл. Даже если у вас есть текстовый редактор, который поддерживает запись на месте, они обычно сначала пытаются обрезать файл, что, конечно, не поддерживается в устройстве специальных символов.
решение3
В 1970-х годах у нас были аппаратные терминалы CUI.
Однако в 70-х годах термин CUI никто не использовал.
Теперь в моем Linux-компьютере я вижу семь эмуляторов терминала, где графический интерфейс занимает седьмой эмулятор терминала (Ctrl+Alt+F7).
Эти эмуляторы терминала уже были доступны в 80-х годах, и у них не было графического интерфейса.
Используя какой-нибудь редактор, можно ли узнать, доступен ли этот файл терминала /dev/tty0 в пространстве пользователя?
Этот вопрос не имеет смысла. Все файлы доступны в пользовательском пространстве по замыслу, в этом и заключается весь смысл файлов, особенно в /dev
. /dev/tty0
будучи устройством, его нельзя редактировать, поскольку его "содержимое" по сути эфемерно. То, что вы с него читаете, в конечном итоге вы вводите в консоли, а то, что вы на нем пишете, отображается на экране.
решение4
Да, вы, конечно, можете получить доступ к любому TTY как к файлу, как к любому устройству в unix. Я бы отметил этот вопрос как потенциально дублирующий, какэтотответ хорошо объясняет, как сделать то, о чем вы спрашиваете, в похожей ситуации.
Подводя итог, что говорит этот ответ, вы можете взаимодействовать с другими TTY, используя echo и cat, как и с любым другим файлом. Причина, по которой вы ничего не увидели при открытии файла, заключается в том, что, как и во многих специальных файлах, доступны только новые данные.