PTY / TTY - Что вы не можете сделать только с ведомым FD

Вопрос:

Если у меня есть пара главный/подчиненный pty или tty, что я не могу с ней сделать, если у меня есть только файловый дескриптор подчиненного узла? Или, другими словами: что я могу сделать только, если у меня есть файловый дескриптор главного узла?

Мое текущее понимание:

Я вижу типичные отношения терминала/консоли/SSH, имеющие главный конец для взаимодействия с человеком, и одна или несколько программ (например, оболочка и ее дочерние процессы), находящиеся на ведомом конце. И я (в общих чертах) рассматриваю более необычные (/архаичные?) варианты использования, такие как использование TTY для других типов каналов передачи данных, таких как PPP. Этот вопрос не относится к категории «Я не понимаю этот деловой вопрос по телетайпу». Я спрашиваю о (низкоуровневом?) материале API: например. Существуют ли какие-либо манипуляции с termios/ioctl или другие программные изменения в паре TTY, которые невозможно выполнить, если у вас нет доступа к главному FD?

Я думаю, очевидные из них:

  • Я могу только читать/писать с главного конца, если у меня есть FD главного конца.
  • Grantpt/unlockpt/ptsname может использоваться только на FD главной стороны.

Что-нибудь еще?

Я периодически читал справочные страницы и экспериментировал на своих машинах с Linux: основные вещи, которые хотелось бы делать с pty (например, stty columns 78 и т. д.), похоже, работают на обоих концах. Но я подозреваю, что есть вещи, которые может делать только процесс, содержащий файловый дескриптор главного конца (особенно потому, что дихотомия имени ведущий-ведомый предполагает некоторый односторонний контроль/владычество). И, конечно же, поскольку я тестирую только Linux, возможны различия в поведении между различными версиями/конфигурациями Linux и Unix, поэтому я не хочу предполагать, что то, что я вижу, является переносимым.

Мотивация

(На случай, если кто-то захочет знать, почему я хочу знать)

  1. Общие знания/любопытство.
  2. Мне не нравится текущий выбор инструментов командной строки для работы с ptys. Не вдаваясь в подробности, я просмотрел reptyr, ptyget, expect/empty, screen/tmux (/neercs? тот, что с reptyr-подобной функцией), dtach/abduco, и ни один из них не достиг моей наилучшей минималистской универсальности. Я пытаюсь стать более информированным, чтобы я мог лучше оценить существующие решения и/или лучше разработать свой собственный инструмент (ы), чтобы избавиться от моего особого зуда.

person mtraceur    schedule 08.01.2016    source источник
comment
Вы можете читать/писать на обоих концах, и они делают разные вещи. Ведомое устройство — это терминальное устройство ОС, а ведущее — это то, как вы отправляете нажатия клавиш и получаете вывод программы.   -  person that other guy    schedule 09.01.2016
comment
@thatotherguy Да, спасибо: ваш комментарий показал, что разделы моих вопросов (и текущего понимания) были неоднозначными. Я отредактировал пост, чтобы уточнить, что я имел в виду, что чтение/запись со стороны главного узла было одной из вещей, которые, естественно, можно было сделать только в том случае, если у них был FD главного узла, и чтобы в целом уточнить, о чем я прошу.   -  person mtraceur    schedule 09.01.2016
comment
Дихотомия имен «хозяин-раб» предполагает некоторый односторонний контроль/владычество, я бы сказал, что нет. Дихотомия почти такая же, как и в сетевом соединении: вначале оно не симметрично, но как только соединение установлено, все становится симметричным. master/slave эмулирует линию связи между эмуляцией компьютера и терминала. Мастер означает, что инициирование/закрытие соединения (управление соединением) (обычно) осуществляется со стороны мастера. Могут быть небольшие асимметричные вещи, но почти сложные, как вы упомянули в своем собственном ответе (изменение размера термина - это современный трюк - графический интерфейс).   -  person Jean-Baptiste Yunès    schedule 09.01.2016


Ответы (1)


Благодаря предложениям StackOverflow по связанным вопросам и другим онлайн-поискам с тех пор, как я задал этот вопрос, я нашел (частичный?) ответ:

  • Включение или отключение пакетного режима на PTY в Linux возможно только при наличии основного FD [см. TIOCPKT на этой справочной странице]
  • Получение идентификатора сеанса, связанного с TTY в Linux, может быть выполнено, только если у вас есть основной FD (неясно, является ли это ожидаемым/предполагаемым поведением) [См. TIOCGSID на этой справочной странице]
  • На практике изменение размера TTY можно перенести только из главного FD (эмулятор терминала может изменить размер TTY при изменении его размера, но приложение только с подчиненным FD не имеет реальной уверенности в том, что размер главного FD изменяется соответствующим образом или что драйвер терминала даже примет изменение размера с подчиненного конца). [Источник]
  • Существует хитрость, позволяющая определить, открыт ли ведомый конец TTY, который вы не можете сделать, если у вас нет ведущего FD. [Источник]

Я постараюсь вернуться, чтобы отредактировать это, когда узнаю больше.

person mtraceur    schedule 09.01.2016