国产探花免费观看_亚洲丰满少妇自慰呻吟_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之規范模式

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 揭东县| 平度市| 天镇县| 临颍县| 柘荣县| 东源县| 永登县| 丹棱县| 东山县| 渑池县| 安图县| 绍兴县| 九江市| 英德市| 德兴市| 泰安市| 大新县| 抚州市| 措勤县| 广丰县| 乌苏市| 顺义区| 潢川县| 罗城| 来凤县| 兰溪市| 内乡县| 平果县| 关岭| 土默特左旗| 祁门县| 灵山县| 象州县| 象山县| 紫云| 平舆县| 雅安市| 土默特左旗| 蒙阴县| 西乌珠穆沁旗| 娄烦县|