我使用下一个来更改终端大小:
rc = ioctl(fd, TIOCSWINSZ, &ws);
当我在 linux 文本终端下运行它时(通过 Alt-Ctrl-F1 切换),结果是我希望看到的。在 ioctl 系统调用给定的范围内我的整个输入和输出。
但是当我通过 SSH 连接到 localhost 并运行相同的程序时,它只能部分工作。我的意思是我不能输入比 ioctl 设置的终端大小更宽的命令,但是输出可以跨越 ioctl 给定的终端边界,并且输入可以占用 ioctl 设置的更多行。之后也没有自动回车和换行。
我直接运行程序时看到的唯一区别是它在终端/dev/ttyN上运行,它的主编号是5,当我通过SSH运行程序时,它使用/dev/pts/N作为终端,主编号为136 .所以,据我了解,这是由于终端的差异而发生的。
我的问题:
1. 这是正确的吗?是终端驱动的原因吗?
2. 我该如何解决?我需要通过 SSH 进行相同的行为,就像在本地 tty 终端中一样。
谢谢!
问问题
2210 次
1 回答
9
通常TIOCSWINSZ
由 tty 主机(例如xterm
,Linux 控制台本身等)用来告诉内核驱动程序终端实际有多大。tty slave上运行的程序(即应用程序本身)TIOCGWINSZ
用来查询终端的大小。大多数 tty 驱动程序不支持以其他方式推送它;您通常不能TIOCSWINSZ
从应用程序调用 tty 从属设备并让主设备更改其大小。
某些终端,例如xterm
确实支持转义序列以请求它们调整大小,但这只是一个字节转义序列,而不是ioctl()
命令。
如果您希望应用程序强制终端的大小,那么便携式没有办法做到这一点。不可移植的是,您可以应用一些特殊技巧,例如尝试TIOCSWINSZ
或发送xterm
转义序列。
于 2012-07-15T10:59:47.747 回答