@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 нет. Псевдо-тты - это немного пережиток, оставшийся со времен аппаратных терминалов, подключенных через последовательный кабель.
/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. Теперь начните нажимать клавиши:
Для каждой набранной буквы есть чтение из стандартного ввода и запись в стандартный вывод. Но с чем связан стандарт оболочки? Теперь попробуйте straceна своем терминале с графическим интерфейсом - вам придётся выяснить имя, если вы его не знаете, например, в KDE konsole, и у GNOME есть gnome-terminal, я полагаю. Вывод из этого strace, вероятно, более загадочный - у меня много poll()и recvfrom(). Я не вижу никаких записей, но если вы теперь извлекаете catтрюк из другого терминала, вы заметите, что когда вы печатаете, нажатия клавиш, которые читаются кошкой, вообще не вызывают ответа в выводе strace - терминал не ' получаю их. Таким образом, приложение терминала GUI и cat конкурируют для чтения с того же устройства, на которое выводится оболочка.
echo Hello > /dev/pts/1
... Посмотрите, что происходит, это ваш терминал.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
:Теперь переключитесь на другую консоль и попробуйте:
Умная. Теперь попробуйте:
Затем попробуйте использовать оболочку в / dev / pts / 4. Вы застряли, пока не выйдете с
cat
другой стороны, но большинство из того, что вы вводите на pts / 4, будет проходить (например, пробуя «hello world», который я закончилhl
на pts / 4 иello word
наcat
консоли).Я предполагаю, что устройство получает данные из оболочки и выводит их через систему, что и отражается на экране - оболочка не связана с аппаратным обеспечением, а система. Попробуйте
strace bash
(и посмотрите,man strace
если вы не знаете, что это такое); вы получаете предварительный поток звонков при запуске bash. Теперь начните нажимать клавиши:Для каждой набранной буквы есть чтение из стандартного ввода и запись в стандартный вывод. Но с чем связан стандарт оболочки? Теперь попробуйте
strace
на своем терминале с графическим интерфейсом - вам придётся выяснить имя, если вы его не знаете, например, в KDEkonsole
, и у GNOME естьgnome-terminal
, я полагаю. Вывод из этогоstrace
, вероятно, более загадочный - у меня многоpoll()
иrecvfrom()
. Я не вижу никаких записей, но если вы теперь извлекаетеcat
трюк из другого терминала, вы заметите, что когда вы печатаете, нажатия клавиш, которые читаются кошкой, вообще не вызывают ответа в выводе strace - терминал не ' получаю их. Таким образом, приложение терминала GUI и cat конкурируют для чтения с того же устройства, на которое выводится оболочка.источник