Terminal 课程输出';sl';如果在终端上运行而不是从日志中运行,则会发生更改?

Terminal 课程输出';sl';如果在终端上运行而不是从日志中运行,则会发生更改?,terminal,escaping,ncurses,ioctl,Terminal,Escaping,Ncurses,Ioctl,我正在写一个终端,试图用蒸汽机车作为试验台,但遇到了一个不寻常的问题。即使是在常规终端(如xterm或mate终端)中,如果运行应用程序(即sl与将其记录到文件(即sl>sl.txt然后cat itcat sl.txt 这在sl-h上尤其明显,在最初的几秒钟内,输出的代码将使铁路交叉口的X/O显示为错误地将X/O放置在线路的开头 似乎有一个ioctl正在发生,它以某种方式改变了换行行为,使其前进到下一行,而不是返回到开头。例如,strace sl-h2>sllog.txt显示:ioctl(1,

我正在写一个终端,试图用蒸汽机车作为试验台,但遇到了一个不寻常的问题。即使是在常规终端(如xterm或mate终端)中,如果运行应用程序(即
sl
与将其记录到文件(即
sl>sl.txt
然后cat it
cat sl.txt

这在
sl-h
上尤其明显,在最初的几秒钟内,输出的代码将使铁路交叉口的X/O显示为错误地将X/O放置在线路的开头

似乎有一个
ioctl
正在发生,它以某种方式改变了换行行为,使其前进到下一行,而不是返回到开头。例如,
strace sl-h2>sllog.txt
显示:
ioctl(1,SNDCTL\u TMR\u STOP或TCSETSW,{B38400 opost isig-icanon echo…})=0

您如何将其作为终端进行检测?有哪些系统?为什么ncurses不直接使用转义序列来传达这些信息呢?有很多问题我不知道如何在我的终端中处理。

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

  • 能够读取单个字符(并忽略可能绑定到它们的信号,如退出),以及
  • 管理输出的能力,包括在屏幕上移动,比简单的
    printf
    更少的字符
在原始模式下,禁用从换行到回车和换行的Unix样式转换。这样,ncurses就可以用一个字符直接向下移动一行(在同一列中)。光标寻址通常使用6个或更多字符。即使是向下的光标也会使用3个字符


顺便说一下,这种对换行符的处理是终端描述通常为换行符分配光标向下功能的原因。

然后一个更好的问题是终端如何检测到PTS另一端的从机正在请求原始模式?可以使用检查终端模式,但实际上无法在每次需要时轮询该模式在屏幕上绘制一个字符。似乎像sl和xterm这样的终端也不这样做。。。我似乎找不到它们内部的机制来检测变化。终端驱动程序执行换行等操作,因此终端只能看到原始数据流。嗯。。。我,作为终端,当我看到一个字符10时,我必须在某个点决定将光标向下移动一行。。。我必须决定是否要将光标移动到行的开头。