我有一个名为g_data的全局变量,该变量持有一个指向结构的指针,该结构在许多变量中包含两个变量以容纳终端的高度和宽度。 下面的函数 signalhandler 检查终端是否已调整大小。在这种情况下,函数update_data会将这两个变量的值更改为终端的当前高度和宽度。
我的问题是,无论何时调用函数tgetnum,它都会 似乎没有获得当前的终端大小(在调整大小之后)。
我正在使用Ubuntu 18.04LTS
typedef struct s_data
{
t_lst *lst;
t_ldim ldim;
t_pos pos;
int height;
int width;
int max;
int lstsize;
} t_data;
int i = 0;
void signalhandler(int sig)
{
if (sig == SIGWINCH)
{
update_data(g_data);
if (g_data == NULL)
exit(EXIT_FAILURE);
enable_cap("ti");
print_args(g_data);
printf("%d - %d\n", i++, tgetnum("co"));
signal(SIGWINCH, signalhandler);
}
else if (sig == SIGTSTP)
{
signal(SIGTSTP, SIG_DFL);
modify_main_caps(SET);
enable_cap("te");
ioctl(0, TIOCSTI, "\032");
}
else if (sig == SIGCONT)
{
signal(SIGTSTP, signalhandler);
modify_main_caps(UNSET);
update_data(g_data);
enable_cap("ti");
print_args(g_data);
}
}
答案 0 :(得分:1)
在Linux手册页中查找tgetnum
,它表示:
这些例程作为使用termcap库的程序的转换帮助而包括在内。它们的参数相同,并且使用terminfo数据库模拟例程。因此,它们只能用于查询已编译terminfo条目的条目的功能。
在人中查找 terminfo 时说:
Terminfo是一个描述终端的数据库,供面向屏幕的程序使用...
因为它是一个数据库,所以没有动态更新。它仅从数据库中获取当前终端的静态定义的信息。
在Google上四处搜寻,发现http://man7.org/tlpi/code/online/dist/tty/demo_SIGWINCH.c.html设置了一个SIGWINCH
处理程序,然后使用ioctl
大致获取了更新的大小:
struct winsize ws;
ioctl(STDIN_FILENO, TIOCGWINSZ, &ws);
printf("Caught SIGWINCH, new window size: "
"%d rows * %d columns\n", ws.ws_row, ws.ws_col);