Невозможно изменить размер терминала на pty / N (работает на ttyN)

Я использую следующий, чтобы изменить размер терминала:
rc = ioctl(fd, TIOCSWINSZ, &ws);
Когда я запускаю его в текстовом терминале Linux (переключение с помощью Alt-Ctrl-F1), результат такой, какой я ожидал увидеть. Весь мой ввод и вывод в пределах диапазонов, заданных системным вызовом ioctl.
Но когда я подключаюсь к localhost по SSH и запускаю ту же программу, она работает только частично. Я имею в виду, что я не могу вводить команду шире, чем размер терминала, установленный ioctl, но вывод может пересекать границы терминала, заданные ioctl, а ввод может занимать больше строк, установленных ioctl. Кроме того, после этого нет автоматического возврата каретки и новой строки.
Единственное отличие, которое я вижу, когда я запускаю программу напрямую, она запускается на терминале / dev / ttyN, и его основной номер равен 5, и когда я запускаю программу через SSH использует / dev / pts / N в качестве терминала со старшим номером 136. Итак, как я понял, это происходит из-за разницы в терминалах.
Мои вопросы:
1. Это правильно? Причина в драйверах терминала?
2. Как исправить? Мне нужно такое же поведение через SSH, как и в локальном терминале tty.

Спасибо!


person van    schedule 14.07.2012    source источник


Ответы (1)


Обычно TIOCSWINSZ используется мастером tty (например, xterm, самой консолью Linux и т. Д.), Чтобы сообщить драйверу ядра, насколько велик терминал на самом деле. Программа, работающая на ведомом tty (т. Е. Само приложение), использует TIOCGWINSZ для запроса размера терминала. Большинство драйверов tty не поддерживают обратную передачу; как правило, вы не можете вызвать TIOCSWINSZ на ведомом tty из приложения и заставить ведущее устройство изменить его размер.

Некоторые терминалы, такие как xterm, поддерживают escape-последовательности для запроса на изменение размера, но это всего лишь побайтовая escape-последовательность, а не команда ioctl().

Если вы хотите, чтобы приложение изменяло размер терминала, то нет возможности сделать это портативно. К сожалению, вы можете применить несколько специальных приемов, таких как попытка TIOCSWINSZ или отправка xterm escape-последовательности.

person LeoNerd    schedule 15.07.2012
comment
Итак, возвращаясь к моим вопросам: 1. В целом да. Причина в драйверах. Потому что не все драйверы позволяют передавать размер от подчиненного терминала к главному. 2. Нет портативного способа. Я могу попробовать использовать ioctl и escape-последовательности. Верный? Спасибо! - person van; 16.07.2012
comment
По моему опыту (за несколько минут до этого комментария) xterm не поддерживает escape-последовательность vt100 ‹esc› [8; ‹h›; ‹w› t, но gnome-terminal поддерживает. В общем, это не та функция, на которую можно положиться. - person Ryan V. Bissell; 11.05.2016