Насколько мне известно, /dev/pts
файлы создаются для сеансов SSH или Telnet.
tty
.
Насколько мне известно, /dev/pts
файлы создаются для сеансов SSH или Telnet.
tty
.
Ответы:
Ничего не хранится в /dev/pts
. Эта файловая система живет исключительно в памяти.
Записи в /dev/pts
являются псевдо-терминалами (pty для краткости). Ядра Unix имеют общее понятие терминалов . Терминал предоставляет приложениям способ отображать вывод и получать ввод через оконечное устройство . Процесс может иметь управляющий терминал - для приложения в текстовом режиме он взаимодействует с пользователем.
Терминалы могут быть аппаратными терминалами («tty», сокращенно от «teletype») или псевдо-терминалами («pty»). Аппаратные терминалы подключаются через некоторый интерфейс, такой как последовательный порт ( ttyS0
,…) или USB ( ttyUSB0
,…) или через экран компьютера и клавиатуру ( tty1
,…). Псевдо-терминалы предоставляются эмулятором терминала, который является приложением. Некоторые типы псевдо-терминалов:
Если программа открывает терминал для записи, вывод этой программы появляется на терминале. Обычно несколько программ выводят на терминал одновременно, хотя иногда это может сбивать с толку, поскольку невозможно определить, какая часть вывода получена от какой программы. Фоновые процессы, которые пытаются записать на свой управляющий терминал, могут автоматически приостанавливаться сигналом SIGTTOU .
Если программа открывает терминал для чтения, ввод от пользователя передается этой программе. Если несколько программ читают с одного терминала, каждый символ направляется независимо к одной из программ; это не рекомендуется. Обычно в данный момент времени с терминала активно читает только одна программа; программы, которые пытаются читать со своего управляющего терминала, пока они не находятся на переднем плане , автоматически приостанавливаются сигналом SIGTTIN .
Чтобы поэкспериментировать, запустите tty
терминал, чтобы узнать, что это за терминальное устройство. Скажем так /dev/pts/42
. В оболочке другого терминала запустите echo hello >/dev/pts/42
: строка hello
будет отображаться на другом терминале. Теперь запустите cat /dev/pts/42
и введите другой терминал. Чтобы убить эту cat
команду (что затруднит использование другого терминала), нажмите Ctrl+ C.
Запись в другой терминал иногда полезна для отображения уведомления; например, write
команда делает это. Чтение с другого терминала обычно не выполняется.
strace
читать программу ввода, но это все.
tostop
флаг tty. Этот флаг не установлен по умолчанию. И я исправлюсь на чтение из анотера TTY. Я попробовал это, и это работает, но это для каждого чтения, а не для каждого символа (когда вы сидите в приглашении оболочки, они совпадают с тем, что оболочки читают по 1 символу за раз). Возможно, было бы хорошо прояснить этот момент, поскольку именно так я и интерпретировал ваш ответ.
read
вызов будет возвращать только последовательные символы (или, точнее, байты, я бы сказал), но приложение не контролирует, сколько байтов read
будет возвращать вызов, так что это не лучше.
Файлы в /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 нет. Псевдо-тты - это немного пережиток, оставшийся со времен аппаратных терминалов, подключенных через последовательный кабель.
/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 конкурируют для чтения с того же устройства, на которое выводится оболочка.
echo Hello > /dev/pts/1
... Посмотрите, что происходит, это ваш терминал.