当前位置:嗨网首页>书籍在线阅读

12-终端属性和窗口大小

  
选择背景色: 黄橙 洋红 淡粉 水蓝 草绿 白色 选择字体: 宋体 黑体 微软雅黑 楷体 选择字体大小: 恢复默认

64.7 终端属性和窗口大小

伪终端主从设备共享终端属性(termios)和窗口大小(winsize)结构。(这两个结构体在第62章中介绍过。)这表示运行在伪终端主设备上的程序可以通过在主设备文件描述符上调用tcsetattr()和ioctl()来修改从设备端的属性和窗口大小。

一个修改终端属性会带来好处的例子就是script程序。假设我们在一个终端模拟器窗口中运行script程序,然后修改窗口的大小。在这种情况下,终端模拟器程序将通知内核相应的终端设备窗口大小发生了改变,但这个改变不会影响到内核对伪终端从设备的记录(见图64-4)。结果就是运行在伪终端从设备上的面向屏幕的程序(比如vi)输出将出现乱码,因为它们所理解的窗口大小与实际的终端窗口大小不一致。我们可以按如下步骤来解决这个问题。

1. 在script父进程中安装一个SIGWINCH信号处理例程,这样当终端窗口发生变化时可以由此信号得到通知。

2. 当script父进程收到SIGWINCH信号时,使用TIOCGWINSZ ioctl()操作为终端窗口相关联的标准输入获取一个winsize结构体。然后利用这个结构体在TIOCSWINSZ ioctl()操作中设定伪终端主设备的窗口大小。

3. 如果新的伪终端窗口大小与旧的不同,那么内核会产生SIGWINCH信号给伪终端从设备的前台进程组。vi这样的屏幕处理程序可捕获这个信号并执行一个TIOCGWINSZ ioctl()操作来更新它们的终端窗口大小。

我们在62.9节详细介绍了有关终端窗口大小和TIOCGWSINZE以及TIOCSWINSZ ioctl()操作的细节。