
terminal大小变化如何通过ssh或telnet发送到命令行应用程序?
用户使用ssh或telnet连接到远程计算机。
他们开始在VIM中编辑文档。
然后他们调整他们的terminal窗口。
Java邮件客户端不能在linux上工作
linux:search最近修改的* .PHP文件
数据报套接字中的单播源地址过滤
在一个文件中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访问服务器
为什么不调用“轮询”在sysfs设备属性文件上正确的阻塞?
这是伪终端的混乱世界。
在本地,当您调整终端的大小时,前台进程组将获得一个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也可以获得这个信号,并且可以更新它的终端大小的想法。
调整终端窗口的大小会生成一个SIGWINCH信号。
另请参阅相关的glibc文档 。
总结以上是内存溢出为你收集整理的如何通过ssh或telnet将terminal大小更改发送到命令行应用程序?全部内容,希望文章能够帮你解决如何通过ssh或telnet将terminal大小更改发送到命令行应用程序?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)