Я использую следующий, чтобы изменить размер терминала:
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.
Спасибо!
Невозможно изменить размер терминала на pty / N (работает на ttyN)
Ответы (1)
Обычно TIOCSWINSZ
используется мастером tty (например, xterm
, самой консолью Linux и т. Д.), Чтобы сообщить драйверу ядра, насколько велик терминал на самом деле. Программа, работающая на ведомом tty (т. Е. Само приложение), использует TIOCGWINSZ
для запроса размера терминала. Большинство драйверов tty не поддерживают обратную передачу; как правило, вы не можете вызвать TIOCSWINSZ
на ведомом tty из приложения и заставить ведущее устройство изменить его размер.
Некоторые терминалы, такие как xterm
, поддерживают escape-последовательности для запроса на изменение размера, но это всего лишь побайтовая escape-последовательность, а не команда ioctl()
.
Если вы хотите, чтобы приложение изменяло размер терминала, то нет возможности сделать это портативно. К сожалению, вы можете применить несколько специальных приемов, таких как попытка TIOCSWINSZ
или отправка xterm
escape-последовательности.