国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 操作系統 > 正文

終端I/O之終端窗口的大小

2024-06-28 13:27:41
字體:
來源:轉載
供稿:網友
終端I/O之終端窗口的大小

大多數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();

}


上一篇:偽終端

下一篇:終端I/O之規范模式

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 酉阳| 宜兰市| 恩施市| 三亚市| 贵德县| 宜州市| 南昌市| 连城县| 屯昌县| 鄂托克旗| 铜川市| 荥经县| 济阳县| 延长县| 确山县| 深圳市| 兴和县| 右玉县| 阿城市| 镇宁| 商丘市| 云南省| 宜春市| 辽中县| 邵阳县| 连云港市| 盐津县| 吉安县| 微山县| 遵义市| 芮城县| 宜都市| 多伦县| 饶阳县| 镶黄旗| 连州市| 铁岭县| 浮梁县| 利川市| 揭东县| 深水埗区|