免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3786 | 回复: 0
打印 上一主题 下一主题

putty伪终端问题?SIGWINCH信号在putty窗口调整大小时没有触发,导致vi界面混乱 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-04-17 11:31 |只看该作者 |倒序浏览
本帖最后由 可可火山 于 2011-04-17 11:53 编辑

这个问题Linux那边也发了,但到底是个Solaris上的问题,我是solaris新手,问题可能定位到了,但是还没太好的解决方案。大家慢慢看看,需要更多信息我补上。

//目标系统Solaris 10, 登录系统需要先登录服务器A,然后通过pbrun登录目标机器。
Host A$pbrun ssh -l user targetserver

问题:
我登录系统后,打开vi编辑文件,把窗口重设后发现屏幕乱了,需要Ctrl+L手动刷新,很不方便也很容易误操作。

观察到的现象是stty -a输出的rows,columns都是改变窗口前的。
user@ubuntu:~$ stty -a | grep rows
speed 38400 baud; rows 44; columns 166; line = 0;
user@ubuntu:~$ echo $LINES
44
user@ubuntu:~$ echo $COLUMNS
166

开始不了解背后的原理,stty手动设置也没什么用。(不过可以解决个vi Terminal too wide的问题,具体见后面)
后来看《Solaris系统编程》的终端部分,看到伪终端 resize window部分,原来是当伪终端切换大小时,内核会发送个SIGWINCH信号。同时他还提供个测试程序,我在下面两个环境上测试了下。发现有问题的环境上在调整大小时没有触发SIGWINCH信号,现在看到了现象和可能的问题原因。
测试1:
登录一台Solairs,开测试程序,然后改变大小,会发现每次改变都触发了SIGWINCH信号
测试2:
我的应用场景,先登录服务器A,然后通过pbrun登录目标机器。开测试程序,然后改变大小,发现每次改变都没有触发了SIGWINCH信号

想到的一个办法是设置putty当窗口大小变化时,不改变窗口大小。
就是不要选“Change the number of rows and columns”,其他都可以。

不知道没触发SIGWINCH信号的根本原因是pbrun还是什么?或者说ssh的什么参数可以保证发送SIGWINCH信号?



---------------- 终端SIGWINCH信号测试程序 目前就solaris下能编译-------------------
termsize.c
  1 #include <stdio.h>
  2 #include <unistd.h>
  3 #include <termios.h>
  4 #include <signal.h>
  5
  6 static volatile sig_atomic_t got_sigwinch;
  7
  8 static void print_winsize (int fd);
  9 static void sigwinch (int sig);
10
11 int main (void)
12 {
13         if (sigset (SIGWINCH, sigwinch) == SIG_ERR)
14                 printf("err_msg sigset\n");
15
16         got_sigwinch = 0;
17         print_winsize (STDIN_FILENO);
18
19         for (;;) {
20                 pause ();
21                 if (got_sigwinch) {
22                         printf ("SIGWINCH received\n");
23                         print_winsize (STDIN_FILENO);
24                         got_sigwinch = 0;
25                 }
26         }
27 }
28
29 static void print_winsize (int fd)
30 {
31         struct winsize size;
32
33         if (ioctl (fd, TIOCGWINSZ, &size) == -1)
34                 printf("err_msg ioctl\n");
35
36         printf ("%d columns by %d rows (%d pixels by %d pixels)\n",
37                         size.ws_col, size.ws_row, size.ws_xpixel, size.ws_ypixel);
38 }
39
40 static void sigwinch (int sig)
41 {
42         got_sigwinch = 1;
43 }


------------- Terminal too wide ------------
user@server>vi file
Terminal too wide
:

解决方案,改小终端宽度。
Terminal too wide solution:
stty column 120
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP