如何从 Linux 获取窗口大小

2024-01-01

每个人。我对编程还是新手。我确实需要一些帮助来解决我面临的问题。所以,这里的情况是我试图在终端尺寸低于 80x24 时显示警告。根据记录,我的操作系统是 Window,但我使用虚拟机来运行 Linux,因为所有文件都在 Linux 中。当我使用终端运行文件时,警告显示正确。但问题是当我尝试使用 PuTTY 从 Windows 运行该文件时。警告没有出现。我确定是因为我使用的函数只能读取Linux环境,而不能读取Windows环境。任何人都可以帮助我或为我指出如何使其能够获取窗户尺寸的方向。这些文件应该全部保留在 Linux 中。我正在使用C。

这里只是展示有关显示警告和获取尺寸的代码的一部分。

//This is to display warning


int display_warning()
{
 CDKSCREEN *cdkscreen = 0;
 WINDOW *cursesWin    = 0;
 char *mesg[5];
 char *buttons[] = {"[ OK ]"};
 CDKDIALOG *confirm;

 cursesWin = initscr();
 cdkscreen = initCDKScreen (cursesWin);

 initCDKColor();

 mesg[0] = "</2>"The size of Window must be at least 80x24.";
 confirm = newCDKDialog(cdkscreen, CENTER, CENTER, mesg, 1, buttons, A_REVERSE, TRUE,TRUE, FALSE);
 setCDKDialogBackgroundColor(confirm, "</2>");
 injectCDKDialog(confirm,TAB);
 activateCDKDialog(confirm,0);

 if (confirm -> exitType == vNORMAL){
 destroyCDKDialog (confirm);
 destroyCDKScreen (cdkscreen);
 endCDK();
 }
 return 0;
}



//This is to get the dimension

int get_terminal_size()
{
 int cols;
 int lines;

 #ifdef TIOCGSIZE
 struct ttysize ts;
 ioctl(0,TIOCGSIZE, &ts);
 lines = ts.ts_linesl;
 cols = ts.ts_cols;

 #elif defined(TIOCGWINSZ)
 struct winsize ts;
 ioctl(0, TIOCGWINSZ, &ts);
 lines = ts.ws_row;
 cols = ts.ws_col;

 #endif

 if((lines <= 23)||(cols <= 79)){
 display_warning();
 }

 return 0;
}

//then there will be the main function that i think is not necessary to put the code here.

非常感谢所有评论和帮助。我是编程初学者,所以如果有一些基本的东西我不知道,请原谅。

Fikrie


该问题与 PuTTY 本身无关,与 SSH 客户端和伪终端有关。

要避免此问题,请将 PuTTY 配置为使用伪终端。 (在 TTY 面板中,有一个“不要分配伪终端”复选框。确保它未被选中。)

With ssh,你需要使用-t选项告诉ssh使用伪终端。

这是一个简单的示例程序,您可以在 Linux 中使用它来获取终端大小。它不需要诅咒:

#include <unistd.h>
#include <sys/ioctl.h>
#include <errno.h>
#include <stdio.h>

static int get_size(const int fd, int *const rows, int *const cols)
{
    struct winsize sz;
    int            result;

    do {
        result = ioctl(fd, TIOCGWINSZ, &sz);
    } while (result == -1 && errno == EINTR);
    if (result == -1)
        return errno;

    if (rows)
        *rows = sz.ws_row;

    if (cols)
        *cols = sz.ws_col;

    return 0;
}

int main(void)
{
    int rows, cols;

    if (!get_size(STDIN_FILENO,  &rows, &cols) ||
        !get_size(STDOUT_FILENO, &rows, &cols) ||
        !get_size(STDERR_FILENO, &rows, &cols))
        printf("%d rows, %d columns\n", rows, cols);
    else
        fprintf(stderr, "Terminal size is unknown.\n");
    return 0;
}

实际信息是通过使用TIOCGWINSZTTY 控制。

伪终端的大小实际上是由内核维护的。如果没有伪终端,只有标准流,就没有行和列;在这种情况下它只是一个流。特别是,甚至tput lines and tput cols那么就会失败。

如果没有伪终端,许多交互式命令行程序将无法运行。例如,top会报告类似的内容“未设置 TERM 环境变量” or “顶部:tty 获取失败”。其他的也可以,只是不能交互;它们只会输出一次,但就好像终端无限高无限宽一样。

总之,您的应用程序应该识别它是在伪终端中运行(终端大小已知,可能支持诅咒等),还是在流模式下运行(通过 SSH 或 PuTTY,故意不使用伪终端——或者可能只是因为输入输出全部定向到文件或从文件或类似文件中定向)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从 Linux 获取窗口大小 的相关文章

  • 你好世界,裸机 Beagleboard

    我正在尝试在我的 Beagleboard xm rev 上运行 hello world 类型的程序 C 通过调用 Cputs功能来自装配 到目前为止 我一直使用这个作为参考 http wiki osdev org ARM Beagleboa
  • 任务计划程序控制台输出在哪里? (C# 控制台应用程序)

    我正在运行 C Windows 控制台应用程序 并通过任务计划程序传递几个参数 它全天运行 将其他应用程序创建的平面文件数据加载到 SQL Server 中 该程序间歇性失败 并且我有 Try Catch 逻辑 该逻辑使用 Console
  • 递归显式模板实例化可能吗?

    给定一个类似的模板 template
  • 查找周边上的点来表示边界/形状

    我有一个简单的二维网格 其格式为myGrid x y 我正在尝试找到一种方法来找到所选网格周围的周长 这样我就有了所选网格的形状 这是我的意思的一个例子 这里的想法是找到所有相关的 角点 也就是图像周边的红点 放入一个列表中 这样我就可以从
  • 在 std::forward 中它如何接受右值?

    看看斯科特 迈耶的有效的现代 C 第200 201页 建议的简化实施std forward可能是 在其他地方看到了正确的实现 template
  • 管理多个解决方案中存在的 C# 项目的 Nuget 包

    我现在正处于这样的阶段重构疯狂一个有很多的大项目遗留和不稳定的模块 我决定拆分解决方案目前 所有项目 大约有 20 个 而且由于下个月肯定会出现单元测试项目 还会有更多 链接在一起 使其更加独立和细化 通过这种方法 有一些模块 例如需要在多
  • iPhone 编程游戏

    使用 Objective C 还是 C 为 iPhone 编写游戏最好 像 Flight Control 这样的游戏会用什么语言编写 图形应采用什么格式才能在 iPhone 上正确显示并快速加载 像 Flight Control 这样的游戏
  • 本机 C++ 通过代理 C++ 托管 dll 使用 C# dll

    这相当复杂 所以请耐心听我说 我有一个用本机 仅限 Win32 C 编码的第 3 方程序 目标 作为目标设计的一部分 它实现了一个 dll 插件系统 本机 DLL 当放置在程序的 ext 目录中时 由目标加载 然后 目标根据需要调用每个 D
  • 使用 boost::asio 是否有一种可移植的方法来查找空闲端口号

    我目前正在尝试找出一种方法来查找空闲端口号以建立连接 最好使用 boost asio 然后 该端口号将用于侦听 只有这样我才能打开套接字 大致来说 有没有办法做到 tcp resolver query query localhost por
  • flowlayoutpanel和水平滚动条问题

    我正在使用一个 flowlayoutpanel 它有很多逻辑上的按钮 我遇到的问题是 当我调整窗口大小时 当窗口变小时 我无法看到所有水平排列的按钮 相反 当窗口变小时 按钮会下降到下一行 谁能帮我解决这个问题 我只是希望按钮水平排列 当窗
  • 在 C++ 中从另一个数组初始化结构内的数组[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions struc
  • WPF 中可选择的 TextBlock 或带有格式化文本的 TextBox

    我遇到一种情况 我需要显示格式化文本 正常 粗体 突出显示 并且还应该是可选择的 以便用户可以复制文本 我使用了文本块 我可以使用内联内容流元素应用多种格式 但不幸的是它的文本不可选择 虽然文本框允许选择文本并复制到剪贴板 但它不允许我设置
  • std::make_shared 作为默认参数无法编译

    在 Visual C 2008 和 2010 中 以下代码无法编译并出现以下错误 include
  • 有没有办法对 RichTextBox 的撤消历史进行分组或暂时禁用它?

    我目前正在研究 WPF 中 RichTextBox 内的表格 在 WPF 中 表格没有行和列 只有行 每行都有一定数量的单元格 当用户按下 添加列 按钮时 我的程序会向每一行添加一个新单元格 使用此方法的问题是 在用户添加一列后 如果他们按
  • Parallel ForEach 的本地初始化如何工作?

    我不确定 Parallel ForEach 中本地 init 函数的使用 如 msdn 文章中所述 http msdn microsoft com en us library dd997393 aspx http msdn microsof
  • 实例着色器矩阵的设置

    我想绘制实例立方体 我可以打电话GL DrawArraysInstanced PrimitiveType Triangles 0 36 2 成功地 我的问题是所有立方体都绘制在相同的位置和相同的旋转 我如何为每个立方体单独更改它 要创建不同
  • 隐式类型转换 - 编译器错误

    这个问题与this https stackoverflow com questions 3529449 can i make the ternary operator treat my class like a bool问题 下面的代码在V
  • 以编程方式连接和断开 USB,“无需拔出和重新插入”

    我需要以编程方式连接和断开 USB 也就是说 我已经插入了USB设备 我需要使用 C NET 应用程序传输文件 该应用程序将监视特定文件夹并将文件从该文件夹传输到 USB 驱动器 我需要在文件传输后断开 USB 设备的连接 并在需要时连接
  • { Qt5.0.2/QML/QtQuick2.0/C++ } 运行没有错误的示例项目? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我的设置是Qt5 0 2 MinGW 32位 我在寻找 Qt5 0 2 QML QtQuick2 0 C 代码项目示例 不是Qt Qu
  • 将整个单词与特殊字符匹配的正则表达式不起作用? [复制]

    这个问题在这里已经有答案了 我正在经历这个问题C Regex Match 整个单词 https stackoverflow com q 1209049 443568 它说要匹配整个单词使用 b模式 b 这对于匹配没有任何特殊字符的整个单词效

随机推荐

  • JQGrid 当 autowidth = true 时如何删除烦人的水平滚动条? (在 IE 中)

    在 IE 中使用 autowidth true 时 我似乎遇到了烦人的水平滚动条 这是怎么回事 我该如何摆脱它 我得到了完美的解决方案 问题出在 CSS 上 在 ui jqgrid css 中 表格布局是固定的 将其设置为自动 它将完美运行
  • ng-repeat 中的 angularJS 过滤器表达式

    我想知道实现这一点的最优雅和最简单的方法是什么 我需要为 ng repeat 添加一个过滤表达式 该表达式将从一个属性中过滤 2 个条件 在这个例子中http plnkr co edit OMQxXvSjtuudMRGE4eZ8 p pre
  • 如何将 Parquet 文件读入 Pandas DataFrame?

    如何在不设置 Hadoop 或 Spark 等集群计算基础设施的情况下将适度大小的 Parquet 数据集读取到内存中的 Pandas DataFrame 中 这只是我想在笔记本电脑上使用简单的 Python 脚本在内存中读取的适量数据 数
  • 将“昨天”设置为 Jquery 日期选择器

    我正在尝试将昨天设置为Jquery datapicker如下 datepicker datepicker setDate new Date getDate 1 然而 我总是得到今天的日期 代码位于 document ready它确实被执行了
  • R 如何从 geotiff 读取 nodatavalue 标签 - R 栅格包

    我遇到了一个不寻常的结果 R 中没有栅格数据值 下面的代码 我有一个没有导入数据值的栅格 9999 QGIS 读取 nodatavalue arcgis 也是如此 R 当读入geotiff时 将nodata值分配给 INF 我不知道为什么
  • Flurry 4.2.2 SDK 未在 iOS 中发送事件会话数据

    我知道 Flurry 的报告有延迟 但是 我们在第二天没有看到 Flurry 报告的任何结果 Flurry setDebugLogEnabled YES Flurry setLogLevel FlurryLogLevelDebug Flur
  • 在 TeamCity 中从外部文件设置构建参数

    我当前正在使用 TeamCity AssemblyInfo Patcher 在所有 C 程序集上设置程序集版本 我选择的版本方案是 Major Minor build number 0 当我在 TeamCity 中定义主要编号和次要编号时
  • 为什么 xamarin 突然不允许我部署到 iOS 设备

    今天 在我收到 xcode 同意新条款和条件的消息后 这种情况才开始发生 我无法在设备上 任何计算机上放置任何内容 不适用于我的 macbook 不适用于我的 mac mini 不适用于直到昨天还正常工作的现有项目 甚至不适用于全新的项目
  • 无限循环 React hooks

    我不明白为什么我会陷入无限循环useClick我看到我改变了里面的状态值使用效果 using setVal但 useEffect 应该只对第二个参数中指定的 onClick 起作用 我认为这是因为我传递的参数 onClick 已被记忆 但回
  • 自定义视图/操作/控制器在 Sails JS 中不起作用

    我一定做错了什么 但我看不到 基本上如果我通过创建一个控制器 模型sails generate controller products并在文件中 controllers ProductsController我向索引操作添加一些变量 例如 i
  • Laravel Facebook 登录 - 无回调(本地主机)

    我的第一个问题 是否可以在本地主机上进行测试 因为我可以想象这可能是我的问题 我阅读了文档并按照描述执行了所有操作 我浏览到 auth facebook 然后被重定向到 Facebook 在那里我 接受 这些条款 我被重定向到此链接 htt
  • Spring分页-请求参数

    我的 REST 控制器 GetMapping test public Page
  • nrwl/nx 工作区特定原理图

    我一直在研究 nrwl 扩展 它们看起来很棒 但是 当我按照他们的教程进行操作时工作区特定原理图 https nrwl io nx workspace specific schematics 最后一步没有显示要运行的命令 你能告诉我如何运行
  • Android - 如何检测屏幕上的触摸是“滚动”触摸?

    我正在用 Java 创建一个 Android 应用程序 其中有很多
  • 使用 Django/Twilio 进行条件短信响应

    我正在尝试根据不同的参数 来电显示 文本正文 调整短信响应 错误是 HTTP 检索失败 我尝试对不同的调用者使用 Flask 教程 def hello monkey Respond and greet the caller by name
  • 如何在浏览器上永久保存某些值?

    我有一些登录信息 假设用户名 登录电子邮件和位置 即使用户注销并关闭窗口后 我也希望将此信息保留在浏览器中 当用户注销或会话过期后返回时 Web 应用程序会填写客户端用户名并要求用户提供密码 我的要求最好的例子是谷歌登录 目前 我只使用会话
  • SharePoint 2010 中的沙盒解决方案和场解决方案有什么区别

    我是 SharePoint 2010 的新手 沙箱和场解决方案之间的主要区别是什么 你能给我 5 个要记住的差异吗 我用谷歌搜索了 但有很多事情需要理解 作为一个刚起步的人 我想知道基本的区别 感谢您的帮助 农场解决方案 服务器场解决方案托
  • Unity - Firebase 实时数据库 - 获取我在排行榜中的排名

    我有一个使用 firebase 数据库实时进行排行榜的迷你游戏 从 firebase 获取用户分数列表后 我想获取不在列表中的当前用户的分数 获取当前用户的分数很容易 但是如何知道列表中的排名 即 OrderByChild score 这是
  • 从套接字 fd 获取 IP 地址、端口和连接类型

    我有一个跟踪网络应用程序的跟踪程序 给定一个属于被跟踪者的套接字文件描述符 跟踪器是否有可能找到它对应的IP 对于服务器来说是它绑定到的接口的IP 对于客户端来说是被绑定接口的地址 用于建立连接的接口 端口号和连接类型 是否有 libc A
  • 如何从 Linux 获取窗口大小

    每个人 我对编程还是新手 我确实需要一些帮助来解决我面临的问题 所以 这里的情况是我试图在终端尺寸低于 80x24 时显示警告 根据记录 我的操作系统是 Window 但我使用虚拟机来运行 Linux 因为所有文件都在 Linux 中 当我