ioctl返回一个空的winsize结构

时间:2015-10-18 13:07:29

标签: c struct terminal

我一直在尝试编写一个程序,对于所说的程序,我需要终端窗口的大小;但是我遇到了一些麻烦,这就是正在发生的事情。我正在使用一个函数来获取带有ioctl的终端的大小,并返回一个winsize结构,但返回的结构如下所示:  (ws_row = 0, ws_col = 0, ws_xpixel = 0, ws_ypixel = 0)

但是,当我这样做时: printf("Screen Width: %d", win.ws_col);

成功打印出终端尺寸。即使值为0。我获取结构的代码如下:

/*
 * Creates a winsize struct with the screen dimensions
 */
struct winsize get_screen_dimensions()
{
    struct winsize wbuf;

    if (ioctl(0, TIOCGWINSZ, &wbuf) != -1)
    {
        return wbuf;
    }
    return wbuf;
}

打印值时的用法如下所示,请记住打印确实打印正确的值但是在lldb中,值都是0:

struct winsize win = get_screen_dimensions();
printf("Screen Width: %d", win.ws_col);

其他用法,如下所示:

struct winsize winset = get_screen_dimensions();
unsigned short scrnwdth = winset.ws_col;

在这种情况下,在lldb中,scrnwdth也是0。我真的很难过......我正在运行的操作系统是Mac OS X El Capitan 10.11。我在Debian中尝试过,得到了相同的结果。

1 个答案:

答案 0 :(得分:1)

ioctl是否失败,您的示例代码返回结构wbuf。如果您的程序正在读取管道或其他非tty输入,它将失败(例如)。

返回时wbuf是否已清除具体实现。如果文档中没有提到特定行为,则在处理错误时,系统可以自由地(a)清除值,(b)不修改值或(c)将它们设置为有趣/有用的值。