下面代码中的程序,会打印当前窗口的大小。每次窗口大小改变的时候,程序会接收到一个SIGWINCH信号,然后打印新的大小。我们需要通过一个信号来终止这个应用程序。
例子:打印窗口大小
#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();
}
在一个终端窗口中运行这个应用程序,我们会得到如下的输出:
$ ./a.out
35 rows, 80 columns initial size
SIGWINCH received change window size: signal is caught
40 rows, 123 columns
SIGWINCH received and again
42 rows, 33 columns
^? $ type the interrupt key to terminate
网友评论