gpt4 book ai didi

c - 如何获得终端窗口宽度?

转载 作者:可可西里 更新时间:2023-11-01 11:50:30 28 4
gpt4 key购买 nike

我正在使用 Clinux 开发嵌入式系统。用户可以通过 SSH 或控制台串行电缆连接到设备。他可以通过 PuTTY 或 Tera Term 来做到这一点。我的问题是,他连接后,我怎么知道他的窗口宽度?我尝试了不同的方法,如果我在 linux pc 上模拟我的系统,它们会起作用,但它们都不能在设备上起作用:

  1. ioctl()

    struct winsize ws;
    ioctl(..., TIOCGWINSZ, &ws);

    此方法在pc上有效,但在设备上总是返回0。

  2. tgetnum()

    setupterm((char *)0, 1, (int *)0);
    CGR_INT columns = tgetnum("co");

    此方法适用于 pc,但在设备上始终返回 80x24。

  3. getmaxyx()

    CGR_INT xdim;
    CGR_INT ydim;
    initscr();
    refresh();
    getmaxyx(stdscr, ydim, xdim);

    此方法在pc上有效,但在设备上总是返回0

最佳答案

TIOCGWINSZ 是必经之路。您的相关设备必须公布其尺寸,否则无法正常工作。以xterm为例:

device —— ttyS driver —— ttyS0 devnode —— screen/minicom
xterm —— pty devnode —— pty driver —— pts devnode —— bash

xterm 在第一次生成时执行 ioctl(TIOCSWINSZ) 以让 tty 驱动程序知道窗口大小。 bash 和从中产生的程序然后可以查询它。如果您调整 xterm 窗口的大小,它会告诉 tty 驱动程序新的大小,并且 xterm 还会向其子进程(在本例中为 bash)发出 SIGWINCH 以通知它大小更改。

如果设备(例如您的设备)一开始就不知道自己连接的是什么设备,则不会发生这种情况。 tty 驱动程序也不知道连接到它的是什么。 (它通常也不关心。)xterm 可以告诉驱动程序大小,因为它可以发出 ioctl,但是 ioctl 不是通过串行传输的。理论上它需要的是一个专门的内核驱动程序,它知道如何与您的特定设备通信大小更改(可能是串行之上的协议(protocol),因此不需要重写核心组件)。

请注意,连接的设备甚至可能没有固定区域的概念——例如一台打印机可以被认为实际上有无限多行。

如果 ncurses 看到 0x0,它就假定为 80x24,因为程序员是这样定义的。这个大小可能不正确,实际上通常不是因为人们可以调整他们的窗口大小(即使他们不能,比如在 tty1 上,他们仍然可以使用像 screen(1) 这样的东西并将大小缩小到小于 80x24 ).

关于c - 如何获得终端窗口宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8527243/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com