Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么每次调整终端大小时,函数tgetnum(“co”)都不会更新?_C_Termcap - Fatal编程技术网

为什么每次调整终端大小时,函数tgetnum(“co”)都不会更新?

为什么每次调整终端大小时,函数tgetnum(“co”)都不会更新?,c,termcap,C,Termcap,我有一个名为g_data的全局变量,它保存一个指向结构的指针,该结构包含两个变量,用于保存终端的高度和宽度。 下面的函数signalhandler检查终端是否已调整大小。在这种情况下,函数update_data将这两个变量的值更改为终端的当前高度和宽度 我的问题是,无论何时调用函数tgetnum,它 似乎无法获取当前端子大小(调整大小后) 我正在使用Ubuntu18.04LTS typedef struct s_data { t_lst *lst; t_ldim ldim

我有一个名为g_data的全局变量,它保存一个指向结构的指针,该结构包含两个变量,用于保存终端的高度和宽度。 下面的函数signalhandler检查终端是否已调整大小。在这种情况下,函数update_data将这两个变量的值更改为终端的当前高度和宽度

我的问题是,无论何时调用函数tgetnum,它 似乎无法获取当前端子大小(调整大小后)

我正在使用Ubuntu18.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);
    }
}

在Linux手册页中查找
tgetnum
,它显示:

这些例程作为使用termcap库的程序的转换辅助工具提供。它们的参数相同,并且使用terminfo数据库模拟例程。因此,它们只能用于查询已编译terminfo条目的条目的功能

在《人》中查找terminfo,它说:

Terminfo是描述终端的数据库,用于面向屏幕的程序

因为它是一个数据库,所以没有动态更新。它只从数据库中获取当前终端的静态定义信息。
更新:

通过谷歌搜索,我找到了设置
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);

我在mac上编写代码,从未遇到过这样的问题,函数tgetnum总是发送更新的大小。感谢您的帮助。
tgetnum
在MacOS上是由ncurses完成的,它没有这样做:-)示例程序不完整,但显示的片段似乎从信号处理程序调用了不安全的函数(使结果不可靠)。@ThomasDickey没关系,只是测试样本,下面的答案已经提供了解决方案。谢谢