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 также отправит SIGWINCH своему дочернему процессу (в данном случае bash), чтобы уведомить его об изменении размера.
Ничего этого не происходит с устройствами (такими как ваше), которые не имеют ни малейшего представления, к чему они подключены. Драйвер tty также не знает, что с ним связано. (И обычно это не важно.) Xterm может сообщить драйверу размер, потому что он может выдавать ioctl, но ioctl не передаются, например, через последовательный порт. Теоретически для этого потребуется специализированный драйвер ядра, который знает, как сообщать об изменениях размера с вашим конкретным устройством (возможно, протокол поверх последовательного интерфейса, так что не требуется перезапись основного компонента).
Обратите внимание, что подключенное устройство может даже не иметь понятия фиксированной области, например можно считать, что принтер имеет практически бесконечное число строк.
ncurses просто принимает 80x24, если видит 0x0, потому что программист определил его таким образом. Этот размер может быть неправильным, и на практике это обычно не так, потому что люди могут изменять размеры своих окон (даже если они не могут, например, на tty1, они все равно могут использовать такие вещи, как screen (1) и уменьшать размер до размера, меньшего 80x24 ).