这ttysize
是 SunOS 3.0(1986 年 2 月)的原始实现,不久后被 废弃winsize
,它增加了以像素为单位的窗口大小。以下是<sys/ttycom.h>
SunOS 4 中的定义:
/*
* 窗口/终端尺寸结构。
* 此信息由内核存储
* 为了提供一致的界面,
* 但不被内核使用。
*
* 类型必须是“无符号短”,因此不需要 types.h。
*/
结构体大小 {
无符号短 ws_row;/* 行,以字符为单位 */
无符号短 ws_col;/* 列,以字符为单位 */
无符号短 ws_xpixel;/* 水平尺寸,像素 - 未使用 */
无符号短ws_ypixel;/* 垂直大小,像素 - 未使用 */
};
#define TIOCGWINSZ _IOR(t, 104, struct winsize) /* 获取窗口大小 */
#define TIOCSWINSZ _IOW(t, 103, struct winsize) /* 设置窗口大小 */
/*
* Sun 版本相同。
*/
结构 ttysize {
int ts_lines; /* 终端的行数 */
int ts_cols; /* 终端的列数 */
};
#define TIOCSSIZE _IOW(t,37,struct ttysize)/*设置tty大小*/
#define TIOCGSIZE _IOR(t,38,struct ttysize)/* 获取 tty 大小 */
数据类型不同(整数会浪费内存),并且字段具有不同的名称。
该ttysize
结构早已过时:如果系统提供任何一个,winsize
则支持。在 1997 年将 ncurses 移植到 SCO OpenServer 时,情况并非如此,正如lib_setup.c 中的此块所述:
/*
* SCO 定义了 TIOCGSIZE 和相应的结构。其他系统(SunOS、
* Solaris, IRIX) 定义 TIOCGWINSZ 和 struct winsize。
*/
#ifdef TIOCGSIZE
# 定义 IOCTL_WINSIZE TIOCGSIZE
# 定义 STRUCT_WINSIZE 结构 ttysize
# 定义 WINSIZE_ROWS(n) (int)n.ts_lines
# 定义 WINSIZE_COLS(n) (int)n.ts_cols
#别的
# ifdef TIOCGWINSZ
# 定义 IOCTL_WINSIZE TIOCGWINSZ
# 定义 STRUCT_WINSIZE struct winsize
# 定义 WINSIZE_ROWS(n) (int)n.ws_row
# 定义 WINSIZE_COLS(n) (int)n.ws_col
# 万一
#万一
您可能会注意到评论中没有提到 Linux。根据asm-sparc64/ioctls.h中的评论,从2.6.16ttysize
开始不支持ioctl :
/* 请注意,所有在 Linux 中不可用的 ioctl 都有一个
* 前面的双下划线:a) 避免某些程序
* 认为我们在 Linux 下支持一些 ioctl(自动配置的东西)
*/
...
#define TIOCCONS _IO('t', 36)
#define __TIOCSSIZE _IOW('t', 37, struct sunos_ttysize) /* SunOS 特定 */
#define __TIOCGSIZE _IOR('t', 38, struct sunos_ttysize) /* SunOS 特定 */
#define TIOCGSOFTCAR _IOR('t', 100, int)
#define TIOCSSOFTCAR _IOW('t', 101, int)
#define __TIOCUCNTL _IOW('t', 102, int) /* SunOS 特定 */
#define TIOCSWINSZ _IOW('t', 103, struct winsize)
#define TIOCGWINSZ _IOR('t', 104, struct winsize)
1995 年更早的评论添加了定义(没有双下划线)。可能有一些程序在 Linux 上使用了它,尽管winsize
在 Linux 开始之前在大多数平台上已经很好地建立了。进一步挖掘发现双下划线是在 1996 年引入的(patch-2.1.9 linux/include/asm-sparc/ioctls.h)。鉴于此,很少有程序会在 Linux 上使用它。
进一步阅读: