我一直在尝试编写一个程序,对于所说的程序,我需要终端窗口的大小;但是我遇到了一些麻烦,这就是正在发生的事情。我正在使用一个函数来获取带有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中尝试过,得到了相同的结果。
答案 0 :(得分:1)
ioctl是否失败,您的示例代码返回结构wbuf
。如果您的程序正在读取管道或其他非tty输入,它将失败(例如)。
返回时wbuf
是否已清除具体实现。如果文档中没有提到特定行为,则在处理错误时,系统可以自由地(a)清除值,(b)不修改值或(c)将它们设置为有趣/有用的值。