我有以下代码来获取Linux中屏幕的宽度和高度。
#ifdef TIOCGSIZE
struct ttysize ts;
ioctl(STDIN_FILENO, TIOCGSIZE, &ts);
cols = ts.ts_cols;
lines = ts.ts_lines;
#elif defined(TIOCGWINSZ)
struct winsize ts;
ioctl(STDIN_FILENO, TIOCGWINSZ, &ts);
cols = ts.ws_col;
lines = ts.ws_row;
#endif /* TIOCGSIZE */
ttysize和winsize有什么区别?
最佳答案
ttysize
是SunOS 3.0的最初实现(1986年2月),不久之后就被winsize
淘汰了,它增加了窗口的像素大小。这是
SunOS 4的<sys/ttycom.h>
中的定义是什么:
/*
*窗口/终端尺寸结构。
*这些信息由内核存储
*为了提供一致的接口,
*但不被内核使用。
*
*类型必须是“unsigned short”,这样就不需要类型.h。
*/
结构winsize{
无符号短ws_row;/*行,以字符为单位*/
无符号短ws_col;/*列,以字符为单位*/
无符号短ws_xpixel;/*水平大小,像素-未使用*/
无符号短ws_ypixel;/*垂直大小,像素-未使用*/
};
#定义TIOCGWINSZ IOR(t,104,struct winsize)/*获取窗口大小*/
#定义TIOCSWINSZ IOW(t,103,struct winsize)/*设置窗口大小*/
/*
*太阳版本相同。
*/
结构大小{
int ts_lines;/*终端上的行数*/
int ts_cols;/*终端上的列数*/
};
#定义TIOCSSIZE\u IOW(t,37,struct tty size)/*设置tty大小*/
#定义TIOCGSIZE(t,38,struct tty size)/*获取tty大小*/
数据类型不同(整数会浪费内存),字段的名称也不同。ttysize
结构早就过时了:如果系统提供了任何一个,winsize
都受支持。这在1997年将ncurses移植到SCO OpenServer时是不正确的,如本文chunk from lib_setup.c所述:
/*
*SCO定义了TIOCGSIZE和相应的结构。其他系统(SunOS,
*Solaris,IRIX)定义TIOCGWINSZ和struct winsize。
*/
#ifdef TIOCGSIZE公司
#定义IOCTL\u WINSIZE TIOCGSIZE
#定义结构WINSIZE STRUCT ttysize
#定义WINSIZE_行(n)(int)n.ts_行
#定义WINSIZE\u COLS(n)(int)n.ts\u COLS
#其他
#ifdef TIOCGWINSZ公司
#定义IOCTL\u WINSIZE TIOCGWINSZ
#定义结构WINSIZE结构WINSIZE
#定义WINSIZE_行(n)(int)n.ws_行
#定义WINSIZE_COLS(n)(int)n.ws_col
#恩迪夫
#恩迪夫
您可能注意到注释中没有提到Linux。根据asm-sparc64/ioctls.h中的注释,ttysize
的ioctl在2.6.16时不受支持:
/*注意,Linux中不可用的所有ioctl都有
*前面的双下划线:a)避免某些程序
*认为我们在Linux下支持一些ioctl(自动配置的东西)
*/
...
#定义TIOCCONS_IO('t',36)
#定义TIOCSSIZE IOW('t',37,struct sunos\u ttysize)/*特定于sunos*/
#定义TIOCGSIZE IOR('t',38,struct sunos\u ttysize)/*特定于sunos*/
#定义tiocgsoftwarior('t',100,int)
#定义TIOCSOFTCAR IOW('t',101,int)
#定义特定于SunOS的*/
#定义TIOCSWINSZ IOW('t',103,struct winsize)
#定义TIOCGWINSZ IOR('t',104,struct winsize)
更早的comment in 1995添加了定义(没有双下划线)。可能有一些程序在Linux中使用了它,尽管在Linux开始之前,winsize
已经在大多数平台上建立了。再深入一点发现,双下划线是在1996年引入的(patch-2.1.9 linux/include/asm-sparc/ioctls.h)。鉴于此,很少有程序将其用于Linux。
进一步阅读:
Garbage-collect struct ttysize(OpenBSD邮件列表)
/dev/consoleMKS手册页
关于linux - ttysize和winsize结构之间的区别?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18878141/