[Solaris]putty窗口调整大小时没有发出SIGWINCH信号,导致vi界面混乱
本帖最后由 可可火山 于 2011-04-17 11:30 编辑
虽然问题是在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
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论