2015-10-18 94 views
0

我一直在试图编写一个程序,并为所说的程序,我需要的终端窗口的大小;但是我有一些麻烦,这是发生了什么。我用一个函数来获取与ioctl终端的大小和它返回一个使用winsize结构,但返回的结构是这样的: (ws_row = 0, ws_col = 0, ws_xpixel = 0, ws_ypixel = 0)ioctl正在返回一个空的winsize结构

然而,当我这样做: 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

我在调试使用lldb的程序时看到相同的问题。我认为这个问题不是很清楚,你应该重新格式化它,提供一个可重现的例子和失败运行的实际输出。也就更清楚了,这个问题只在lldb中放入了一个lldb标签。 – anddam

回答

1

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

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

+0

同意,我应该改变这一点,任何洞察力,为什么值都是零,但打印出来是否正确?我应该补充的是,函数本身内部的值在返回语句之前也是0. – skylerl

+0

请注意,ioctl没有失败,至少在我的情况下。问题是,在运行lldb时调用TIOCGWINSZ的ioctl将导致成功的调用,并且所有字段都设置为零的结构winsize。有没有解决方法让lldb以某种方式将当前终端设置“传递”到已启动的进程? – anddam