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

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

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

решение1

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

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

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

  • Приложения с графическим интерфейсом, такие как xterm, gnome-terminal, konsole, … преобразуют события клавиатуры и мыши в текстовый ввод и отображают вывод графически с использованием определенного шрифта.
  • Мультиплексорные приложения, такие как screen и 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команда делает это. Чтение с другого терминала обычно не выполняется.

решение2

Файлы в /dev/pts— это «псевдо-tty». Они в какой-то степени похожи на именованные каналы, но также имитируют старые последовательные терминалы, такие как VT-100. Псевдо-tty выполняют работу по передаче байтов с клавиатуры в программу и из программы на устройство вывода, что звучит просто. Но это отвечает на ваш вопрос о явности: /dev/pts/0например, ядро ​​ничего не хранит. В него поступают только потоки байтов из stdout программы, подключенной к псевдо-tty, и программы, stdin которых подключен к тому же псевдо-tty, считывают эти байты.

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

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

Псевдо-tty также разрешают все системные вызовы "set baud rate", "set parity" и т. д. ioctl()и, вероятно, ничего не делают с ними. Это позволяет программам, написанным во времена VT-100, ADM-3 и Wyse, продолжать работать без ошибок. Программное обеспечение, драйвер устройства псевдо-tty, действует как аппаратное обеспечение.

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

В Linux и многих Unix есть псевдотерминалы. В Plan 9 их нет. Псевдотерминалы — это своего рода реликт, оставшийся со времен аппаратных терминалов с последовательным кабелем.

решение3

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

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

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

> tty
/dev/pts/4

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

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

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

> cat /dev/pts/4

Затем попробуйте использовать оболочку на /dev/pts/4. Вы застрянете, пока не выйдете catс другой стороны, но большая часть того, что вы наберете на pts/4, пройдет (например, попытка ввести "hello world" у меня закончилась на hlpts/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на вашем терминале GUI — вам придется выяснить имя, если вы его не знаете, например, в KDE это konsole, а в GNOME, я полагаю, есть gnome-terminal. Вывод оттуда, straceвероятно, более загадочный — у меня много poll()и recvfrom(). Я не вижу никаких записей, но если вы теперь воспользуетесь catтрюком с другого терминала, вы заметите, что при наборе текста нажатия клавиш, которые считывает cat, не вызывают вообще никакой реакции в выводе strace — терминал их не получает. Таким образом, приложение терминала GUI и cat конкурируют за чтение с одного и того же устройства, на которое оболочка выводит данные.

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