终端大小的更改是如何通过ssh或telnet发送到命令行应用程序的?
终端必须告诉ssh/telnet窗口大小已经更改。这是怎么发生的?
然后,ssh/telnet使用自己的特定方法将更改发送到sshd/telnetd。这些方法是什么?
然后sshd/telnetd告诉应用程序终端大小已经改变。这是怎么做到的。它是否与从终端到ssh/telnet的方法相同?
发布于 2013-10-03 11:32:30
这是一个混乱的假终端世界。
在本地,当您调整终端的大小时,您的前台进程组将得到一个SIGWINCH,您可以使用ioctl获取新的大小。但是这与远程 vim进程有什么关系呢?
主题相当复杂,但其要点是删除服务器(sshd)这样做:
posix_openpt (或openpty)打开主using终端设备setsid()切断其终端连接STDIN_FILENO和朋友)替换为步骤4中的fd此时,服务器进程写入主端的任何内容都会以从端输入的形式结束,但是具有终端行的会约束,因此内核在编写某些组合时会执行一些神奇的操作--就像发送信号一样,您还可以发出具有有用效果的ioctl调用。
考虑这一点的最好方法是探索openssh套件。
SIGWINCH -请参阅clientloop.c,并在接收到它时设置received_window_change_signal = 1。client_check_window_change检查标志,告诉服务器:
packet_start(SSH_CMSG_WINDOW_SIZE);packet_put_int((u_int)ws.ws_row);因此,现在服务器应该接收一个指定(可能是新的)大小的数据包。
pty_change_window_size,这就实现了真正的魔力:
w.ws_row = row;.(void) ioctl(ptyfd,TIOCSWINSZ,&w);/*这是它!*/这将设置从服务器的新窗口大小。如果新的大小与旧的不同,内核将向与该pty关联的前台进程组发送一个。因此,vim也可以获得该信号,并可以更新其终端大小的概念。
发布于 2013-10-03 10:55:45
调整终端窗口大小会产生SIGWINCH信号。
也请参阅相关的glibc文档。
https://stackoverflow.com/questions/19157202
复制相似问题