如果在终端上运行Ncurses的'sl'输出,则日志会改变吗?

时间:2018-07-30 20:22:43

标签: terminal escaping ncurses ioctl

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

这在sl-h上特别明显,在最初的几秒钟内,输出代码,这些代码将使铁路道口的X / O出现,如果显示的话,将X / O错误地放在行的开头

bad truncated output from SL

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

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

1 个答案:

答案 0 :(得分:1)

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

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

在原始模式下,Unix风格的换行回车换行的转换被禁用。这样,ncurses可以使用单个字符直接向下移动一行(在同一列中)。游标寻址通常使用6个或更多字符。甚至光标向下也将使用3个字符。

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