Как Linux использует / dev / tty и / dev / tty0

8

Я могу увидеть разницу между / dev / tty и / dev / tty0, протестировав предоставленный метод из этого вопроса . Но мне очень интересно практическое использование этих устройств (например, ситуации, в которых они будут использоваться).

Рон Винс
источник
@ 0xC0000022L Почему-то я не могу связать tty с sda, потому что в отличие от sda, tty имеет 3 разных категории (tty, tty0, tty [1, .., N]).
Рон Винс
Я думаю, что приведенная @ 0xC0000022L аналогия вводит в заблуждение. И то, /dev/sdaи другое /dev/sda1обозначают конкретные блочные устройства (одно оказывается частью другого). /dev/ttyс другой стороны, это виртуальное устройство, не связанное ни с каким другим конкретным tty.
Селада

Ответы:

16

/dev/ttyявляется управляющим tty текущего процесса для любого процесса, который фактически открывает этот специальный файл. Это не обязательно виртуальное консольное устройство ( /dev/ttyn ), и может бытьпоследовательный порт и т. д. Если управляющий tty не является виртуальной консолью, то процесс не должен взаимодействовать с консольными устройствами, даже если его псевдотетти фактически реализована на системной консоли. Например для оболочки в эмуляторе терминала под локально работающим X-сервером указанные программы образуют такую ​​цепочку взаимодействий, как:

   Оболочка Unix
     ⇕ /dev/pts/2(≡ /dev/ttyдля своих процессов)
 ядро pty драйвер
     ⇕ /dev/ptmx
 эмулятор терминала
     ⇕ Протокол X Window
   X сервер
     ⇕ /dev/tty7(≡ /dev/ttyдля сервера)
 системная консоль
zxc↿⇂ [_̈░░]
    пользователь

Использование /dev/ttyпользовательских программ включает в себя:

  • Напишите что-нибудь на управляющий терминал, игнорируя все перенаправления и каналы;
  • Сделайте ioctl () - смотрите tty_ioctl (4);
  • Например, отсоединиться от терминала (TIOCNOTTY).

/dev/tty0является текущим активным (я. е. видно на мониторе) виртуальная консоль от операционной системы . Этот специальный файл вряд ли в значительной степени используется системным программным обеспечением, но /dev/consoleфактически является «псевдонимом»tty0 и /dev/consoleшироко используется демонами системного журнала, а иногда и самим ядром.

Эксперимент, чтобы показать разницу: запустить rootоболочку на tty3( Ctrl+ Alt+ F3) или в эмуляторе терминала. Сейчас же

# sleep 2; echo test >/dev/tty

затем быстро Ctrl+ Alt+ F2, подождите две секунды и Ctrl+ Alt+ все обратно. Где вы видите выход?
И теперь тот же тест для /dev/tty0.

Incnis Mrsi
источник
Ваш ответ не имеет разницы с ответом на вопрос, который я связал в своем вопросе. Что меня беспокоит, так это процесс того, как ядро ​​использует их вместе.
Рон Винс
@ Рон Винс: обновлено.
Инснис Мрси
Обязательно ли для процесса писать в / dev / tty вместо своего конкретного / dev / tty [1, .., N]?
Рон Винс
@ Рон Винс: Опять же, процесс, выполняемый в сеансе SSH (технически, дочерний элемент sshd) или в xtermокне, не имеет своего конкретного / dev / tty  n . Он не взаимодействует с устройствами системной консоли , потому что он подключен к псевдо-терминальному устройству. Это не мешает ему открывать / dev / tty  n, если это корневой процесс, или тот же пользователь вошел в систему на tty  n . О добавлении некоторых пунктов о «конкретном tty» к ответу.
Инснис Мрси
Допустим, я использую xterm, который является эмулятором терминала. Это цепочка (xterm -> / dev / tty -> / dev / pty -> / dev / tty [1, .., N] -> shell)? Для / dev / tty0, я думаю, я ясно об этом. Вывод любых процессов и ядра будет отправлен в / dev / tty [1, .., N], который теперь обрабатывает драйвер устройства tty. Это цепочка (ядро / процесс -> / dev / tty0 -> current / dev / tty [1, .., N])
Рон Винс
2

/ dev / tty - управляющий tty для любого процесса. Это может быть ваша оболочка.

Если ваш процесс не имеет контрольного tty, / dev / tty недоступен, это, например, верно для демонов.

Если ваш процесс имеет управляющий tty, то / dev / tty является псевдонимом драйвера для реального драйвера tty, который ваш процесс использует для stdin, stdout или stderr.

Смотрите man -s7d ttyдля получения дополнительной информации. Обратите внимание, что раздел, в котором находится это руководство, может отличаться в разных ОС и его не следует путать со справочной страницей в разделе 1. Поэтому проверьте, например man -k tty.

Шили
источник
msgstr "псевдоним реального драйвера tty, который использует ваш процесс". Является ли цитируемый текст ссылкой на tty [1, .., N]?
Рон Винс
Псевдоним драйвера - это нечто иное, чем просто псевдоним. Это другой драйвер, но он направляет работу к тому, с чем действительно связан ваш процесс.
Щил
Если я правильно понимаю (также обратитесь к tldp.org/HOWTO/Text-Terminal-HOWTO-7.html#ss7.3 ), / dev / tty - это интерфейс для текущего процесса (в настоящее время обрабатывается ЦП) к / dev / tty [1, .., N]. Между тем, / dev / tty0 предназначен для вывода данных, которые не принадлежат конкретному / dev / tty [1, .., N], поэтому выводятся в / dev / tty [1, .., N], который принадлежит текущему процессу , Если они верны, мне интересно, когда будет фактически использоваться / dev / tty0.
Рон Винс
Если у вас нет собственного дома, возможный альтернативный вход в этот дом не даст вам дома.
Шили
Таким образом, / dev / tty0 предназначен для вывода данных в текущий сеанс оболочки суперпользователя (связан с / dev / tty [1, .., N]).
Рон Винс