Могу ли я получить доступ к файлу терминала?

Могу ли я получить доступ к файлу терминала?

В 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:

  1. В графическом эмуляторе,sudo cat /dev/tty1
  2. Переключитесь на эмулятор виртуальной консоли с помощью Ctrl+Alt+F1
  3. Введите что-нибудь в эмулятор виртуальной консоли.
  4. Переключитесь обратно в графический интерфейс с помощью Ctrl+Alt+F7.
  5. В графическом эмуляторе я бы увидел все, что я набрал в эмуляторе виртуальной консоли, как выводcat

С другой стороны, я также мог бы отображать символы в виртуальной консоли, используя программу, которая использует write()системный вызов, например tee:

  1. В графическом эмуляторе,echo "hello world" | sudo tee /dev/tty1
  2. Переключитесь на эмулятор виртуальной консоли с помощью Ctrl+Alt+F1
  3. В эмуляторе виртуальной консоли я бы увидел "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, как и с любым другим файлом. Причина, по которой вы ничего не увидели при открытии файла, заключается в том, что, как и во многих специальных файлах, доступны только новые данные.

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