规范与非规范终端输入

2024-02-10

我正在准备考试,我对 Unix 中规范与非规范输入/输出的工作方式感到困惑(例如,curses)。我知道有一个缓冲区可以应用“行规则”来进行规范输入。这是否意味着非规范输入会绕过缓冲区,或者只是意味着不应用任何线路规则?此过程对于输入和输出操作有何不同?

在我使用的用于演示规范输入的curses 程序中,用户键入的输入会在键入一定数量的字符或经过一定时间后自动输入。这些事情中的任何一个都被视为“线路纪律”还是完全是另一回事?


For canonical input — think shell; actually, think good old-fashioned Bourne shell, since Bash and relatives have command-line editing. You type a line of input; if you make a mistake, you use the erase character (default is Backspace, usually; sometimes Delete) to erase the previous character. If you mess up completely, you can cancel the whole line with the line kill character (not completely standardized, often Control-X). On some systems, you get a word erase with Control-W. All this is canonical input. The entire line is gathered and edited up until the end of line character — Return — is pressed. Thereupon, the whole line is made available to waiting programs. Depending on the read() system calls that are outstanding, the whole line will be available to be read (by one or more calls to read()).

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

规范和非规范输出并不是那么重要的事情。有一些细微的差别,涉及到是否在换行之前回车以及是否进行延迟(对于电子设备来说没有必要;在输出设备可能是 110- 的时代很重要)波特率电传打字机)。它还可以执行诸如处理不区分大小写的输出设备(再次是电传打字机)之类的操作。小写字母以大写形式输出,大写字母以反斜杠和大写形式输出。

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


Titanium Decoy 在评论中问道:

那么对于非规范输入,输入缓冲区是否完全被绕过?另外,生产线纪律从何而来?

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

线条规则类似于输入编辑所做的一组操作。因此,行规则的一个方面是擦除字符在规范输入模式下擦除先前的字符。如果你有icase(输入大小写映射)设置,则大写字符将映射为小写字符,除非前面有反斜杠;我相信,这是一条生产线纪律,或者说是一条生产线纪律的一个方面。


I forgot to mention that EOF processing (Control-D) is handled in canonical mode; it actually means 'make the accumulated input available to read()'; if there is no accumulated input (if you type Control-D at the beginning of a line), then the read() will return zero bytes, which is then interpreted as EOF by programs. Of course, you can merrily type more characters on the keyboard after that, and programs that ignore EOF (or run in non-canonical mode) will be quite happy.

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

Similarly, the interrupt and quit signals are artefacts of canonical mode processing. So too are the job control signals such as Control-Z to suspend the current process and return to the shell. Likewise, flow control (Control-S, Control-Q to stop and start output) is provided by canonical mode.

罗奇金德的第四章高级 Unix 编程,第二届 https://rads.stackoverflow.com/amzn/click/com/0131411543涵盖终端 I/O 并提供大部分此类信息 — 以及更多信息。其他 UNIX 编程书籍(至少是好的书籍)也会介绍它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

规范与非规范终端输入 的相关文章

  • 模拟用户输入以使用不同参数多次调用脚本

    我必须使用提供的脚本 该脚本在脚本运行时接受用户输入而不是参数 我无法解决这个问题 脚本的一个例子是 bin bash echo param one read one doSomething echo param two read two
  • 过滤(搜索和替换)InputStream 中的字节数组

    我有一个 InputStream 它将 html 文件作为输入参数 我必须从输入流中获取字节 我有一个字符串 XYZ 我想将此字符串转换为字节格式 并检查从 InputStream 获得的字节序列中是否存在与该字符串匹配的字符串 如果有的话
  • JQuery 使用一个复选框以编程方式取消选中其他复选框

    我正在寻找一个脚本 其中一个复选框将取消选中另一个复选框 虽然有点复杂 因为所有数据都是以编程方式加载的 因此 如果未选中某个复选框 则过程将获取其 src 值 然后遍历其他输入并查找标题为 RQlevel 单击元素的 src 值的输入 并
  • 使用 setcap 功能运行时 JLI_InitArgProcessing 的 Java“符号查找错误”

    我们在服务器上安装了 Java 11 旨在监视网络接口的流量 初始安装后 yum install java 11 openjdk devel x86 64 the java命令对两者都适用root and a 普通用户 但是 我们的 Jav
  • 操作系统崩溃的常见原因[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有兴趣了解 操作系统崩溃 不限于Windows崩溃 最常见的技术原因 从操作系统编程的角度 有哪些 我正在寻找一个不像 打开太多应用
  • 是否有我可以运行的操作系统命令来确定是否在基于 Xen 的虚拟机内运行

    我可以在基于 Xen 的虚拟机中运行一个操作系统命令来告诉我它是一个虚拟机而不是物理机 我听说内核对此有一些自我意识智能 例如就像 ps 输出中的额外列之类的 我知道 vmstat 提供了 st 列 但我在运行 Linux 内核 2 6 1
  • Linux 中 AF_UNIX 数据报消息的最大大小是多少?

    目前我已达到 130688 字节的硬限制 如果我尝试在一条消息中发送更大的内容 我会收到一条消息ENOBUFS error 我已经检查过net core rmem default net core wmem default net core
  • 去除iOS输入阴影

    在 iOS Safari 5 上 我必须遵循输入元素 顶部内部阴影 我想删除顶部阴影 错误 webkit appearance不保存 目前的风格是 input border radius 15px border 1px dashed BBB
  • 为什么 textarea 不是 input[type="textarea"]?

    为什么有一个元素
  • 如何在不登录主机的情况下从IP查找主机名

    我需要找到一个 UNIX 主机的主机名 该主机的 IP 是已知的 而无需登录到该 UNIX 主机 Use nslookup http en wikipedia org wiki Nslookup nslookup 208 77 188 16
  • 如何在Unix中将相对路径转换为绝对路径[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想转换 相对路径 home stevin data APP SERVICE datafile txt to 绝对路径 home stev
  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • 为什么 Linux 对目录使用 getdents() 而不是 read()?

    我浏览 K R C 时注意到 为了读取目录中的条目 他们使用了 while read dp gt fd char dirbuf sizeof dirbuf sizeof dirbuf code Where dirbuf是系统特定的目录结构
  • 角度 4 单击按钮功能未触发

    我正在尝试检查文本输入是否为空或不在角度 4 中 我没有为此使用表单 这只是一个输入字段 当我在下面的按钮中执行 addLocaton 函数时 需要进行检查 我的输入字段
  • Javafx 从 TextField 获取输入

    这是我当前的代码 它所做的只是为我制作的计算器设置一个 GUI 界面 我希望用户输入两个值 然后当按下 Sum 按钮时 它将两个值加在一起并将其显示在 Sum 文本字段中 我正在尝试使用 JavaFX 如果您能提供一些帮助 我将不胜感激 i
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 如何执行“sudo nvm”?

    在我的 Mac 上 我想将一些需要 su 权限的包迁移到另一个节点版本 我使用 homebrew 安装 nvm 现在我需要执行 sudo nvm 或 reinstall packages将失败 me MacBook sudo nvm sud
  • 如何检查用户是否按下了某个键?

    在java中 我有一个程序需要连续检查用户是否按下了某个键 所以在伪代码中 就像 if isPressing w do somthing 在java中 你不检查是否按下了某个键 而是检查listen to KeyEvents 实现您的目标的
  • UNIX系统调用监视器

    如何监控进程的系统调用 Check strace http linux die net man 1 strace 在最简单的情况下 strace 运行指定的命令直到退出 它拦截并记录进程调用的系统调用以及进程接收的信号 每个系统调用的名称
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行

随机推荐