Как ведомое устройство PTS взаимодействует с файловым дескриптором PTM?

Чтобы найти сигналы, которые данное приложение обрабатывает самостоятельно, найдите вызовы sigactionи signalв исходном коде. Библиотеки также могут устанавливать обработчики сигналов, так что вам действительно нужно посмотреть на них тоже...

Не заглядывая в исходный код, вы можете найти те, которые используют strace, которые имеют специальную поддержку системных вызовов, связанных с сигналом -:

strace -e trace=signal...

Это запустит вашу программу и выдаст информацию обо всех системных вызовах, связанных с сигналом -. Из этого вы сможете определить, какие сигналы используются.

-1
15.10.2019, 08:54
2 ответа

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

Реальный физический терминал имеет две совершенно разные стороны (или «аспекты», если хотите):

  • «Внешняя» сторона, на которой сидит пользователь. На этой стороне есть клавиатура, на которой пользователь вводит символы, и экран, на котором пользователь видит вывод компьютера. В псевдотерминальной абстракции это главная сторона.

  • «Внутренняя» сторона, представленная символьным устройством в операционной системе. В псевдотерминальной абстракции это «ведомая» сторона.

Между «внешней» стороной физического терминала и «внутренним» символьным устройством, используемым программами для связи с пользователем, существует целый ряд процессов обработки; оборудование терминала само обновляет экран, операционная система может буферизовать нажатия клавиш пользователя и выполнять редактирование строк и т. д.

A Digital Equipment Corporation VT220 terminal

Терминал Digital Equipment Corporation VT220. Вы смотрите на его «лицевую» сторону. В случае псевдотерминала это представлено "главной" стороной. Картинка из Викимедиа.

  1. Где находится ресурс PTM, который обрабатывает файловый дескриптор?

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

  2. Почему мы называем мастер PTM «устройством»? Так как для него нет записи в /dev.

    Обычно мы не называем это устройством. Обычно мы называем это главной стороной псевдотерминала. Но да, это больше похоже на символьное устройство, чем на обычный файл. Например, процесс, который его удерживает, не может искать предыдущее местоположение --, он может только читать новые байты или записывать новые байты.

  3. Может ли модифицированная программа, такая как SSHD, обмениваться данными с PTS напрямую без PTM в середине?

    Sshd не обменивается данными с ведомой стороной псевдотерминала. Sshd содержит главную сторону псевдотерминала; подчиненная сторона используется процессом (, например, оболочкой ), порожденной Sshd.

    Sshd работает следующим образом:

    • Когда по сети приходит запрос на вход и пользователь аутентифицируется, Sshd создает новый псевдотерминал; он содержит главную сторону, а затем порождает процесс, как того требует удаленный пользователь (, обычно оболочку ), предоставляя ему подчиненную сторону псевдотерминала в качестве стандартного ввода, стандартного вывода и стандартной ошибки.

    • Символы, полученные из сети, записываются Sshd на главную сторону псевдотерминала; это эмулирует пользователя, печатающего на клавиатуре. Ядро обрабатывает (или нет )этот поток символов. Процесс (, например, оболочка ), имеющая подчиненную сторону псевдотерминала, получает их, как если бы он общался с реальным терминалом.

    • Между ведущей и ведомой сторонами находится ядро ​​операционной системы, которое может выполнять некоторую обработку или нет, в зависимости от состояния ведомой стороны. См. линейную дисциплину ,и справочные страницыstty(1 )иioctl(2 )(, особенно применительно к терминалам или подчиненной стороне псевдотерминалов ).

 _______             ______       ______       ______       _____       ______
(       ) bytes in  |      |     |      |     |      |     |     |     | Bash |
(Network)---------->| Sshd |---->|Master|---->|  OS  |---->|Slave|---->|  Vi  |
(       )<----------|      |<----| PTY  |<----|kernel|<----| PTY |<----| Less |
(_______) bytes out |______|     |______|     |______|     |_____|     |______|

 _______           _____      ______      ______      _____      _____      _______
<       > Events  |     |    |      |    |      |    |     |    |     |    (       )
<  GUI  >-------->|Xterm|--->|Master|--->|  OS  |--->|Slave|--->| Ssh |--->(Network)
<       ><--------|     |<---| PTY  |<---|kernel|<---| PTY |<---|     |<---(       )
<_______> Drawing |_____|    |______|    |______|    |_____|    |_____|    (_______)
2
28.01.2020, 05:12

Когда я перехожу к началу этой ссылки оракула, я нахожу «предисловие»:

The STREAMS Programming Guide describes how to use STREAMS in designing and implementing applications and STREAMS modules and drivers, for architectures that conform to the SolarisTM 7 DDI/DDK.

Solaris7 был выпущен в 1998 году -2010 году. И все же эта ссылка на oracle/solaris объясняет настройку в хорошо прокомментированном коде C:

fdm = open("/dev/ptmx", O_RDWR);  /* open master */
grantpt(fdm);                     /* change permission of slave */
unlockpt(fdm);                    /* unlock slave */
slavename = ptsname(fdm);         /* get name of slave */
fds = open(slavename, O_RDWR);    /* open slave */

Изоляция этих двух строк, где открывается char dev:

fdm = open("/dev/ptmx", O_RDWR);    /* open master */
fds = open( slavename,  O_RDWR);    /* open slave */

вы видите симметрию... разница только в том:

  • fdm используетstring "/dev/ptmx"
  • fds использует variable slavename(, содержащий строка как...? (Бонус Q))

Конечно, ссылка сделана здесь:slavename = ptsname(fdm). На простом английском языке :возвращает имя ведомого устройства, принадлежащего fd, которое возвращается при открытии ведущего устройства. Никто не говорил, что это тривиально .

Или это опечатка? Нет! Это ptsname (), вам нужно узнать, какой номер/имя (/dev/pts/8, /dev/pts/17,... )мастер-сторона присвоила «билету», который вы держите. (что fdm "handlle" ).

Иman ptsname:

The ptsname() function returns the name of the slave pseudoterminal device corresponding to the master referred to by fd.

Дважды вы открываете псевдоустройство, чтобы получить файловый дескриптор "fd _", но сначала fdm "только" для получения fds. И затем fds используется для чтения/записи на это новое ведомое устройство.

Напоминает постояльцу отеля, который сначала получил ключ от своей личной комнаты из общей комнаты.


Но я бы никогда не понял всего этого без той проясняющей картины real physical VTпервого изобретателя цветных терминалов, поддерживающих даже звук.

0
28.01.2020, 05:12

Теги

Похожие вопросы