terminal大小变化如何通过ssh或telnet发送到命令行应用程序?
用户使用ssh或telnet连接到远程计算机。
他们开始在VIM中编辑文档。
然后他们调整他们的terminal窗口。
Java邮件客户端不能在Linux上工作
数据报套接字中的单播源地址过滤
在一个文件中search一个string,如果匹配,用同一个stringreplace同一行中的另一个string
Eclipse CDT:Symbol'cout','map','vector','size_t'等无法parsing
terminal必须告诉ssh / telnet窗口大小已经改变。 这是怎么发生的?
ssh / telnet然后使用它自己特定的方法将更改发送到sshd / telnetd。 这些方法是什么?
sshd / telnetd然后告诉应用程序terminal大小已经改变。 这是如何完成的。 这是从terminal到SSH / Telnet的方法相同吗?
在Linux中使用笔记本电脑的光线传感器
innobackupex – 恢复MysqL备份后,服务器无法启动
SIGSTOP如何在Linux内核中工作?
使用除bash之外的shell作为默认shell的SFTP访问服务器
这是伪终端的混乱世界。
在本地,当您调整终端的大小时,前台进程组将获得一个SIGWINCH ,您可以使用ioctl来获取新的大小。 但是这和远程 vim进程有什么关系呢?
主题是相当复杂的,但它的要点是,删除服务器(sshd)这样做:
使用posix_openpt (或openpty )打开主psedoterminal设备
使用setsid()来终止它的终端连接
打开成为其控制终端的终端设备(在步骤1中创建)
用步骤4中的fd替换标准描述符( STDIN_FILENO和朋友)
在这一点上,任何服务器进程写入主端的结束作为输入到从端端,但终端线的纪律,所以内核做一些魔术 – 如发送信号 – 编写某些组合时,你也可以发出ioctl调用有用的效果。
想想这个最好的方法就是去探索openssh套件。
客户端监控SIGWINCH – 请参阅clientloop.c并在received_window_change_signal = 1时设置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与接收的大小,这真正的魔术:
struct winsize w; w.ws_row = row; ... (void) ioctl(ptyfd,TIOCSWINSZ,&w); /* This is it! */
这将设置从站的新窗口大小。 如果新的大小与旧的大小不同,则内核向与该pty关联的前台进程组发送SIGWINCH 。 因此vim也可以获得这个信号,并且可以更新它的终端大小的想法。
另请参阅相关的glibc文档 。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。