Что хранится в файлах / dev / pts и можем ли мы их открыть?

73

Насколько мне известно, /dev/ptsфайлы создаются для сеансов SSH или Telnet.

user2720323
источник
6
echo Hello > /dev/pts/1... Посмотрите, что происходит, это ваш терминал.
Сепарад Салур
5
Смотрите также Как работает терминал Linux?
Жиль "ТАК - перестань быть злым"
1
@SepahradSalour нужно адаптировать число очков к его контексту. мой sshd использовал / dev / pts / 30 для моей сессии.
Габ 是 好人
2
@Gab 是 好人 Чтобы узнать местоположение вашего текущего терминала, вы можете использовать команду tty.
JeromeJ

Ответы:

110

Ничего не хранится в /dev/pts. Эта файловая система живет исключительно в памяти.

Записи в /dev/ptsявляются псевдо-терминалами (pty для краткости). Ядра Unix имеют общее понятие терминалов . Терминал предоставляет приложениям способ отображать вывод и получать ввод через оконечное устройство . Процесс может иметь управляющий терминал - для приложения в текстовом режиме он взаимодействует с пользователем.

Терминалы могут быть аппаратными терминалами («tty», сокращенно от «teletype») или псевдо-терминалами («pty»). Аппаратные терминалы подключаются через некоторый интерфейс, такой как последовательный порт ( ttyS0,…) или USB ( ttyUSB0,…) или через экран компьютера и клавиатуру ( tty1,…). Псевдо-терминалы предоставляются эмулятором терминала, который является приложением. Некоторые типы псевдо-терминалов:

  • Приложения с графическим интерфейсом, такие как xterm, gnome-terminal, konsole,… преобразуют события клавиатуры и мыши в ввод текста и отображают вывод графически с использованием некоторого шрифта.
  • Приложения мультиплексора, такие как экран и релейный ввод и вывод tmux от и к другому терминалу, для отделения приложений текстового режима от реального терминала.
  • Приложения удаленной оболочки, такие как sshd, telnetd, rlogind,… ретранслируют вход и выход между удаленным терминалом на клиенте и pty на сервере.

Если программа открывает терминал для записи, вывод этой программы появляется на терминале. Обычно несколько программ выводят на терминал одновременно, хотя иногда это может сбивать с толку, поскольку невозможно определить, какая часть вывода получена от какой программы. Фоновые процессы, которые пытаются записать на свой управляющий терминал, могут автоматически приостанавливаться сигналом SIGTTOU .

Если программа открывает терминал для чтения, ввод от пользователя передается этой программе. Если несколько программ читают с одного терминала, каждый символ направляется независимо к одной из программ; это не рекомендуется. Обычно в данный момент времени с терминала активно читает только одна программа; программы, которые пытаются читать со своего управляющего терминала, пока они не находятся на переднем плане , автоматически приостанавливаются сигналом SIGTTIN .

Чтобы поэкспериментировать, запустите ttyтерминал, чтобы узнать, что это за терминальное устройство. Скажем так /dev/pts/42. В оболочке другого терминала запустите echo hello >/dev/pts/42: строка helloбудет отображаться на другом терминале. Теперь запустите cat /dev/pts/42и введите другой терминал. Чтобы убить эту catкоманду (что затруднит использование другого терминала), нажмите Ctrl+ C.

Запись в другой терминал иногда полезна для отображения уведомления; например, writeкоманда делает это. Чтение с другого терминала обычно не выполняется.

Жиль "ТАК - перестань быть злым"
источник
Либо я неправильно понимаю, что вы пытаетесь сказать, либо ваша информация неверна. Фоновая запись процессов в терминал не приведет к появлению SIGTTIN. Также несколько программ не могут считывать данные с терминала одновременно (ваше утверждение, что «каждый символ маршрутизируется независимо»). Только одна программа может читать с терминала в любое время, и попытка фоновой программы прочитать с этого терминала приведет к SIGTTIN. Это единственный случай, когда SIGTTIN отправляется автоматически.
Патрик
Также вы не можете читать с другого терминала. Это может стать серьезной уязвимостью безопасности, поскольку вы сможете перехватывать данные. Вы можете straceчитать программу ввода, но это все.
Патрик
4
@Patrick Фоновые процессы записи в терминал получают SIGTTOU, это была опечатка. Несколько программ могут считывать данные с терминала одновременно (попробуйте и посмотрите, как я опишу в следующем параграфе; вы должны сделать это из процесса, управляющим терминалом которого не является этот терминал). Да, вы можете читать с другого терминала, если он принадлежит вам - почему вы думаете, что это будет невозможно?
Жиль "ТАК - перестань быть злым"
Фоновые процессы записи в терминал получают SIGTTOU, только если установлен tostopфлаг tty. Этот флаг не установлен по умолчанию. И я исправлюсь на чтение из анотера TTY. Я попробовал это, и это работает, но это для каждого чтения, а не для каждого символа (когда вы сидите в приглашении оболочки, они совпадают с тем, что оболочки читают по 1 символу за раз). Возможно, было бы хорошо прояснить этот момент, поскольку именно так я и интерпретировал ваш ответ.
Патрик
2
@Patrick Конечно, readвызов будет возвращать только последовательные символы (или, точнее, байты, я бы сказал), но приложение не контролирует, сколько байтов readбудет возвращать вызов, так что это не лучше.
Жиль "ТАК - перестань быть злым"
18

Файлы в /dev/ptsявляются "псевдо-тты". В некоторой степени они похожи на именованные каналы, но они также имитируют старые терминалы последовательного соединения, такие как VT-100. Pseudo-ttys выполняет передачу байтов с клавиатуры на программу и с программы на устройство вывода, что звучит просто. Но это отвечает на ваш вопрос о чистоте: ядро ​​ничего не хранит, /dev/pts/0например. Входят только потоки байтов из стандартного вывода программы, подключенной к псевдотетии, и программы, чей стандарт подключен к тому же псевдотетю, читают эти байты.

Псевдо-тты также вносят слой косвенности в эти потоки байтов. Ядро может проверять байты на наличие специальных значений, таких как «Control-C» или «Control-D» или «Control-U» (все они настраиваемы, см. man stty) И отправлять SIGINT, устанавливать конец файла на stdin или удалять строка на входе. Где-то там также есть функция буферизации, поэтому мои «ничего не хранят» несколько ошибочны, но всего на несколько килобайт.

Ядро может проверять байтовые значения на выходе и делать такие вещи, как превращение новой строки (ASCII linefeed, LF или "\n") в два байта, возврат каретки и перевод строки (CRLF или "\r\n") или любые другие байты, которые требуются аппаратному обеспечению последовательного терминала. Направление псевдотерминала обеспечивает независимость от аппаратного обеспечения.

Pseudo-ttys также разрешает все «установить скорость передачи», «установить четность» и т. Д. ioctl()Системные вызовы и, вероятно, ничего с ними не делать. Это позволяет программам, написанным еще во времена VT-100, ADM-3 и Wyse, продолжать работать без ошибок. Программное обеспечение, драйвер устройства pseudo-ttys, действует как аппаратное обеспечение.

Псевдо-ttys могут использоваться sshdи telnet, но они также используются между эмулятором терминала (например, xtermили rxvt) и оболочкой, которая обычно работает внутри xterm.

Linux и многие Unix-ы имеют псевдо-тты. План 9 нет. Псевдо-тты - это немного пережиток, оставшийся со времен аппаратных терминалов, подключенных через последовательный кабель.

Брюс Эдигер
источник
13

/dev/это специальный каталог для файлов устройств. Это абстракции, а не настоящие файлы на диске. Каталог заполняется при загрузке и может быть изменен, чтобы отразить существующие интерфейсы устройства, которые создаются и уничтожаются ядром и демоном пользовательского пространства udevd.

Многие из представленных устройств являются виртуальными. Это включает в себя записи /dev/pts, которые являются консольными устройствами. Вот почему он создан для удаленных сессий; они также создаются при открытии локального графического терминала.

Вы можете открыть их как файлы, хотя это не имеет большого значения. Чтобы получить /dev/ptsузел, к которому подключена ваша оболочка, используйте tty:

> tty
/dev/pts/4

Теперь переключитесь на другую консоль и попробуйте:

> echo "duck!" > /dev/pts/4

Умная. Теперь попробуйте:

> cat /dev/pts/4

Затем попробуйте использовать оболочку в / dev / pts / 4. Вы застряли, пока не выйдете с catдругой стороны, но большинство из того, что вы вводите на pts / 4, будет проходить (например, пробуя «hello world», который я закончил hlна pts / 4 и ello wordна catконсоли).

Я предполагаю, что устройство получает данные из оболочки и выводит их через систему, что и отражается на экране - оболочка не связана с аппаратным обеспечением, а система. Попробуйте strace bash(и посмотрите, man straceесли вы не знаете, что это такое); вы получаете предварительный поток звонков при запуске bash. Теперь начните нажимать клавиши:

read(0, "h", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "h", 1h)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "e", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "e", 1e)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0
read(0, "y", 1)                         = 1
rt_sigprocmask(SIG_BLOCK, [INT], [], 8) = 0
write(2, "y", 1y)                        = 1
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
rt_sigprocmask(SIG_BLOCK, NULL, [], 8)  = 0

Для каждой набранной буквы есть чтение из стандартного ввода и запись в стандартный вывод. Но с чем связан стандарт оболочки? Теперь попробуйте straceна своем терминале с графическим интерфейсом - вам придётся выяснить имя, если вы его не знаете, например, в KDE konsole, и у GNOME есть gnome-terminal, я полагаю. Вывод из этого strace, вероятно, более загадочный - у меня много poll()и recvfrom(). Я не вижу никаких записей, но если вы теперь извлекаете catтрюк из другого терминала, вы заметите, что когда вы печатаете, нажатия клавиш, которые читаются кошкой, вообще не вызывают ответа в выводе strace - терминал не ' получаю их. Таким образом, приложение терминала GUI и cat конкурируют для чтения с того же устройства, на которое выводится оболочка.

лютик золотистый
источник
какая польза от «cat / dev / pts / 4», когда мы застряли, и почему мы застряли при выполнении этой команды.
user2720323
Я добавил несколько абзацев, чтобы попытаться объяснить это.
Златовласка