Насколько мне известно, /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... Посмотрите, что происходит, это ваш терминал.