Unix/Linux C语言 获取控制台窗口尺寸

在Unix/Linux控制台编程,为了能输出好看一些,需要知道窗口宽度,当然使用支持很宽的窗口的终端也是个办法,但是实在没有很宽的终端怎么办呢,还是要从程序上想办法的。

判断控制台窗口宽度需要两个函数:

  • isatty 判断一个文件描述符是不是控制台终端
  • ioctl 参数TIOCGWINSZ用于获取控制台尺寸

isatty用法很简单,传入参数STDIN_FILENO,表示标准输入,返回0表示非tty。一般就判断标准输入就行了,当然如果考虑输入输出重定向,应该判断标准输出才对。

ioctl复杂一点,第一个参数是文件指针,第二个参数是TIOCGWINSZ,第三个参数是用来接收结果的winsize指针。

winsize结构如下:

cpp 复制代码
struct winsize
  {
    unsigned short int ws_row;
    unsigned short int ws_col;
    unsigned short int ws_xpixel;
    unsigned short int ws_ypixel;
  };

ws_row是行,ws_col是列。

整个代码如下:

cpp 复制代码
	if (0 == isatty(STDIN_FILENO))
	{
		cout << "not tty" << endl;
	}
	else
	{
		winsize sz;
		if (ioctl(STDIN_FILENO, TIOCGWINSZ, (char *)&sz) < 0)
		{
			cout << "get tty size error" << endl;
		}
		else
		{
			cout << "控制台窗口尺寸 ws_row=" << sz.ws_row << " ws_col=" << sz.ws_col << endl;
		}
	}
	if (sizeof(long) != 8)
	{
		cout << "非64位程序!" << endl;
		return 1;
	}

这是我惯用的程序启动流程,顺手判断了是不是64位程序,要是谁改了编译参数,不是64位我就拒绝执行了。

以上程序是在Unix/Linux下运行的,windows上不一定行,也没必要,毕竟windows上的程序不会以控制台为核心的。

(这里是结束)

相关推荐
物理与数学4 小时前
linux 内存分布
linux·linux内核
东城绝神4 小时前
《Linux运维总结:基于ARM64+X86_64架构使用docker-compose一键离线部署MySQL8.0.43 NDB Cluster容器版集群》
linux·运维·mysql·架构·高可用·ndb cluster
creator_Li5 小时前
即时通讯项目--(1)环境搭建
linux·运维·ubuntu
Mr'liu6 小时前
MongoDB 7.0 副本集高可用部署
linux·mongodb
文静小土豆6 小时前
Rocky Linux 二进制 安装K8S-1.35.0高可用集群
linux·运维·kubernetes
暮云星影7 小时前
二、linux系统 应用开发:整体Pipeline流程
linux·arm开发
weixin_430750938 小时前
OpenMediaVault debian Linux安装配置企业私有网盘(三) 静态ip地址配置
linux·服务器·debian·nas·网络存储系统
403240738 小时前
[Jetson/Ubuntu 22.04] 解决挂载 exFAT 硬盘报错 “unknown filesystem type“ 及只读权限问题的终极指南
linux·运维·ubuntu
Source.Liu8 小时前
【沟通协作软件】使用 Rufus 制作 Ubuntu 启动盘的详细过程
linux·ubuntu
Love丶伊卡洛斯8 小时前
Ubuntu 部署 STUN服务端
linux·运维·ubuntu