博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
终端I/O之终端窗口的大小
阅读量:7056 次
发布时间:2019-06-28

本文共 1258 字,大约阅读时间需要 4 分钟。

大多数UNIX系统都提供了一种功能,可以对当前终端窗口的大小进行跟踪,在窗口大小发生变化时,使内核通知前台进程组。内核为每个终端和伪终端保存一个winsize结构:

Struct winsize {

    unsigned short    ws_row;    /* rows, in character */

    unsigned short ws_col;        /* columns, in characters */

    unsigned short ws_xpixel;    /* horizontal size, pixels (unused) */

    unsigned short ws_ypixel;    /* vertical size, pixels (unused) */

};

此结构的作用如下:

  1. 用ioctl函数的TIOCGWINSZ命令可以取此结构的当前值。
  2. 用ioctl函数的TIOCSWINSZ命令可以将此结构的新值存放到内核中。如果此新值与存放在内核中的当前值不同,则向前台进程组发送SIGWINCH信号。
  3. 除了存放此结构的当前值以及在此值改变时产生一个信号以外,内核对该结构不进行任何其他操作。对结构中的值进行解释完全是应用程序的工作。
  4. 提供这种功能的目的是,当窗口大小发生变化时通知应用程序(例如,vi编辑器)。应用程序接到此信号后,它可以取窗口大小的新值,然后重绘屏幕。

 

实例:打印当前窗口大小,然后休眠。每次窗口大小改变时,就捕捉到SIGWINCH信号,然后打印新的窗口大小。必须用一个信号终止此程序。

程序清单18-12 打印窗口大小

#include "apue.h"

#include <termios.h>

#ifndef TIOCGWINSZ

#include <sys/ioctl.h>

#endif

 

static void

pr_winsize(int fd)

{

    struct winsize    size;

    

    if(ioctl(fd, TIOCGWINSZ, (char *)&size) < 0)

        err_sys("TIOCGWINSZ error");

    printf("%d rows, %d columns\n", size.ws_row, size.ws_col);

}

 

static void

sig_winch(int signo)

{

    printf("SIGWINCH received\n");

    pr_winsize(STDIN_FILENO);

}

 

int

main(void)

{

    if(isatty(STDIN_FILENO) == 0)

        exit(1);

    if(signal(SIGWINCH, sig_winch) == SIG_ERR)

        err_sys("signal error");

    pr_winsize(STDIN_FILENO);    /* print initial size */

    for(;;)                /* and sleep forever */

        pause();

}

转载地址:http://vugol.baihongyu.com/

你可能感兴趣的文章
C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 更优美的Oracle数据库上的代码生成器...
查看>>
webdriver鼠标上下滑动
查看>>
WordPress版微信小程序2.4版发布
查看>>
区域极大值—lhMorpRMax
查看>>
关于使用HttpModule模块处理登录验证示例
查看>>
css字体样式(Font Style),属性
查看>>
C#中AppDomain.CurrentDomain.BaseDirectory与Application.StartupPath的区别
查看>>
Java--调试--单步调试,断言,单元测试
查看>>
Sicily 4495. Print permutations
查看>>
silverlight 对ChildWindow返回给父窗体值的理解(转载)
查看>>
大数据量高并发的数据库优化(转)
查看>>
motion的移植和使用
查看>>
css 去除页面双击事件
查看>>
Android View 之进度条+拖动条+星级评论条....
查看>>
Atitit.html解析器的选型 jsoup nsoup ,java c# .net 版本
查看>>
Android解析JSON速度对比
查看>>
javascipt继承机制(from阮一峰)
查看>>
Atitit.http连接合并组件 ConnReducerV3 新特性
查看>>
Android USB Gadget复合设备驱动(打印机)测试方法
查看>>
Windows 7下配置JDK环境变量和Java环境变量配置
查看>>