終端I O之終端視窗的大小

2022-05-04 19:51:37 字數 1510 閱讀 6514

大多數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) */

此結構的作用如下:

用ioctl函式的tiocgwinsz命令可以取此結構的當前值。

用ioctl函式的tiocswinsz命令可以將此結構的新值存放到核心中。如果此新值與存放在核心中的當前值不同,則向前臺程序組傳送sigwinch訊號。

除了存放此結構的當前值以及在此值改變時產生乙個訊號以外,核心對該結構不進行任何其他操作。對結構中的值進行解釋完全是應用程式的工作。

提供這種功能的目的是,當視窗大小發生變化時通知應用程式(例如,vi編輯器)。應用程式接到此訊號後,它可以取視窗大小的新值,然後重繪螢幕。

例項:列印當前視窗大小,然後休眠。每次視窗大小改變時,就捕捉到sigwinch訊號,然後列印新的視窗大小。必須用乙個訊號終止此程式。

程式清單18-12 列印視窗大小

#include "apue.h"

#include

#ifndef tiocgwinsz

#include

#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);

intmain(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之終端選項標誌

中的表18 1至表18 4中列出的所有選項標誌 除遮蔽標誌外 都用一位或幾位 設定或清除 表示,而遮蔽標誌則定義多位,它們組合在一起,於是可以定義多個值。遮蔽位有乙個定義名,每個值也有乙個名字。例如,為了設定字元長度,首先用字元長度遮蔽標誌csize將表示字元長度的位清0,然後設定下列值之一 cs5...

終端I O之終端選項標誌

中的表18 1至表18 4中列出的所有選項標誌 除遮蔽標誌外 都用一位或幾位 設定或清除 表示,而遮蔽標誌則定義多位,它們組合在一起,於是可以定義多個值。遮蔽位有乙個定義名,每個值也有乙個名字。例如,為了設定字元長度,首先用字元長度遮蔽標誌csize將表示字元長度的位清0,然後設定下列值之一 cs5...

終端視窗大小和 termcap

多數 unix 系統都提供了一種跟蹤當前終端視窗大小的方法。在視窗大小發生變化時,核心就會通知前台程序組。核心為每個終端和偽終端都維護了乙個如下的 winsize 結構。struct winsize 此結構的規則如下 1 用 ioctl 函式 見 url 終端i o函式 ioctl url 一節 的...