如果在终端上运行,Ncurses 输出的“sl”会发生变化吗?

Posted

技术标签:

【中文标题】如果在终端上运行,Ncurses 输出的“sl”会发生变化吗?【英文标题】:Ncurses output of 'sl' changes if running on a terminal verses from a log? 【发布时间】:2018-07-30 20:22:43 【问题描述】:

我正在编写一个终端,并试图使用蒸汽机车作为试验台,但遇到了一个不寻常的问题。即使在像 xterm 或 mate-terminal 这样的常规终端中,如果您运行应用程序,输出也会有所不同,即 sl 与将其记录到文件即 sl > sl.txt 然后 cat cat sl.txt

这在sl-h 上尤为明显,在最初的几秒钟内,输出的代码将使铁路道口的 X/O 出现,如果被捕获,则显示错误地将 X/O 置于行首。

似乎有一个ioctl 正在发生,它以某种方式改变换行行为以前进到下一行,但没有返回到开头。 IE。 strace sl-h 2> sllog.txt 显示:ioctl(1, SNDCTL_TMR_STOP or TCSETSW, B38400 opost isig -icanon echo ...) = 0

您如何能够将其检测为终端?有哪些系统?为什么 ncurses 不使用转义序列来传达这些信息?有很多问题我不确定如何在终端中处理。

【问题讨论】:

【参考方案1】:

ncurses(如 Unix curses)将终端置于 原始模式,原因有两个:

能够读取单个字符(并忽略可能绑定到它们的 quit 等信号),以及 能够管理输出,包括使用比简单的printf 更少的字符在屏幕上移动。

在原始模式下,line-feedcarriage-returnline-feed 的 Unix 风格转换被禁用。这让 ncurses 使用单个字符直接向下移动一行(在同一列中)。光标寻址通常使用 6 个或更多字符。即使是向下光标也会使用 3 个字符。

顺便说一句,对换行的处理是终端描述通常具有分配给换行的光标向下功能的原因。

【讨论】:

那么更好的问题是终端如何检测到 PTS 另一端的从设备正在请求原始模式? 终端模式可以通过tcgetattr查看 您实际上无法在每次想要在屏幕上绘制角色时都进行轮询。像 sl 和 xterm 这样的终端似乎也不这样做......我似乎无法在它们中找到检测变化的机制。 终端driver做了换行等的转换,所以终端看到的只是原始数据流。 嗯...我,作为终端,当我看到一个字符 10...要将光标移动到行首。

以上是关于如果在终端上运行,Ncurses 输出的“sl”会发生变化吗?的主要内容,如果未能解决你的问题,请参考以下文章

ncurses程序不会在debian armv7上运行

是否可以在单个 C 程序中的多个终端窗口上输出?

C指针原理(29)-Ncurses-文本终端的图形

利用ncurses库开发终端工具箱—— ToDoList小工具开发

使用没有 SL4A 的 Python android.py 模块

C指针原理(34)-Ncurses-文本终端的图形