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

发布于 2022-10-15 09:23:09 字数 3968 浏览 13 评论 0

本帖最后由 可可火山 于 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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文