当前位置:  开发笔记 > 编程语言 > 正文

规范与非规范终端输入

如何解决《规范与非规范终端输入》经验,为你挑选了1个好方法。

我正在攻读考试,我对Unix中的规范与非规范输入/输出的工作原理感到困惑(例如,curses).我知道有一个缓冲区,"行规则"应用于规范输入.这是否意味着缓冲区被旁路用于非规范输入,还是仅仅意味着没有应用线路规则?输入和输出操作的这个过程有何不同?

在我使用的curses程序中演示了规范输入,用户输入的输入是在键入一定数量的字符或经过一定时间后自动输入的.这些事情中的任何一个都被视为"线条学科"还是完全不同于其他事情?



1> Jonathan Lef..:

对于规范输入 - 想想shell; 实际上,想想老式的Bourne shell,因为Bash和亲戚都有命令行编辑.你键入一行输入; 如果你犯了一个错误,你使用擦除字符(默认是Backspace,通常;有时Delete)擦除前一个字符.如果你完全陷入困境,你可以使用行杀死字符取消整行(通常不完全标准化Control-X).在某些系统上,你会得到一个单词擦除Control-W.所有这些都是规范的输入.收集并编辑整行,直到行尾字符 - Return- 被按下.于是,整条线路可供等待的节目使用.根据未完成的read()系统调用,可以读取整行(通过一次或多次调用)read()).

对于非规范输入 - 想想vi或者vim其他什么 - 你按一个字符,它立即可供程序使用.在你回归之前,你不会被耽搁.系统不对字符进行编辑; 键入后,它们即可供程序使用.程序可以适当地解释事物.现在,vim确实做了一些看起来有点像规范输入的事情.例如,退格键向后移动,并在输入模式下删除那里的内容.但那是因为vim选择让它表现得那样.

规范和非规范输出是一个不太严肃的业务.有一些不同之处,与是否在线路馈送之前回显回车,以及是否延迟(电子设备不需要;在输出设备可能是110-的时候很重要)有关.波特电传).它还可以执行诸如处理不区分大小写的输出设备之类的操作 - 再次进行远程处理.小写字母以大写字母输出,大写字母以反斜杠和大写字母输出.

过去,如果您输入所有大写字母到登录提示,那么登录程序将自动转换为所有大写字母输出的模式,每个实际大写前面都有反斜杠.我怀疑在电子终端上不再这样做了.


在评论中,TitaniumDecoy问道:

因此,对于非规范输入,输入缓冲是否完全被绕过?此外,线路学科在哪里进来?

使用非规范输入时,仍然使用输入缓冲区; 如果没有read()调用等待来自终端的输入的程序,则字符保存在输入缓冲区中.没有发生的是输入缓冲区的任何编辑.

线条规则就像输入编辑所做的操作集.因此,行规则的一个方面是擦除字符在规范输入模式中擦除先前字符.如果设置了icase(输入大小写映射),则大写字符将映射为小写,除非前面加上反斜杠; 我相信这是一门线路学科,或者是线路学科的一个方面.


我忘了提到EOF处理(Control-D)是在规范模式下处理的; 它实际上意味着'使累积的输入可用read()'; 如果没有累积输入(如果你Control-D在一行的开头键入),那么read()将返回零字节,然后程序将其解释为EOF.当然,之后您可以在键盘上快速键入更多字符,忽略EOF(或以非规范模式运行)的程序将非常高兴.

当然,在规范模式中,键盘上键入的字符通常会回显到屏幕上; 您可以控制是否发生回声.然而,这与规范输入有些相关; 即使关闭回声,也会进行正常编辑.

类似地,中断和退出信号是规范模式处理的假象.作业控制信号也是如此,例如Control-Z暂停当前​​进程并返回到shell.同样,流量控制(Control-S,Control-Q停止和开始输出)由规范模式提供.

Rochkind的高级Unix编程第4章,第2版Edn涵盖终端I/O并提供了大量此类信息 - 还有更多信息.其他UNIX编程书籍(至少是好书)也将涵盖它.


因此,对于非规范输入,输入缓冲是否完全被绕过?此外,线路学科在哪里进来?
推荐阅读
kikokikolove
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有