2012-07-14 54 views
3

我使用的下一个来改变终端尺寸:
rc = ioctl(fd, TIOCSWINSZ, &ws);
当运行此linux下文本终端(由Alt键-CTRL-F1切换),结果是我期望看到。整个我的输入和输出在由ioctl syscall给出的范围内。
但是,当我通过SSH连接到本地主机,并运行相同的程序,它只能部分工作。我的意思是我不能输入比由ioctl设置的终端大小更宽的命令,但是输出可以跨越由ioctl给出的终端的边界,并且输入可以采用由ioctl设置的更多行。此后也没有自动回车和换行。
我直接运行程序时看到的唯一区别是它在终端/ dev/ttyN上运行,它的主数字是5,当我通过SSH运行程序时,它使用/ dev/pts/N作为终端,号码136. 所以,据我了解,这是由于终端的差异。我的问题:
1.是对的吗?终端驱动程序中的原因是什么?
2.我该如何解决?我需要像本地tty终端一样通过SSH的行为。

谢谢!无法在PTY改变终端尺寸/ N(适用于ttyN)

回答

6

通常TIOCSWINSZ被tty主控(例如xterm,Linux控制台本身等等)用来告诉内核驱动程序终端实际上​​有多大。运行在tty从站(即应用程序本身)上的程序使用TIOCGWINSZ来查询终端的大小。大多数tty司机不支持以其他方式推动它;通常不能在应用程序的tty slave上调用TIOCSWINSZ,并让主设备更改其大小。

某些终端(例如xterm)确实支持转义序列以请求它们调整大小,但这只是一个字节转义序列,而不是ioctl()命令。

如果你想要应用程序强制终端的大小,那么可移植的是没有办法做到这一点。不可思议的是,你可以应用一些特殊的技巧,例如尝试TIOCSWINSZ或发送xterm转义序列。

+0

所以,回到我的问题: 1.通常是的。司机的原因。因为不是所有的驱动程序都允许将从终端大小推到主机。 2.没有可移植的方式。我可以尝试使用ioctl和转义序列。 是否正确?谢谢! – van 2012-07-15 20:13:50

+0

我的经验(此评论之前几分钟)是xterm不支持​​vt100“ [8; ; t”转义序列,但是gnome-terminal没有。所以一般来说,这似乎不是您可以依赖的功能。 – 2016-05-11 05:36:14