对生的和熟的终端模式感到困惑?

Posted

技术标签:

【中文标题】对生的和熟的终端模式感到困惑?【英文标题】:Confusion about raw vs. cooked terminal modes? 【发布时间】:2012-10-17 18:05:54 【问题描述】:

我目前有一个与a server 成功通信的chat client。我应该修改行为,以便收到另一条聊天消息时提示向下移动(即,通过打印\b 将消息打印在提示“上方”以擦除提示,打印消息,然后重新打印提示)。

我们获得了test clienttest server 用于测试此功能,目前当用户有提示但未输入任何内容时,他们可以接收来自其他用户的消息。当他们开始输入时,缓冲区不会刷新,直到他们输入整个消息并按 ENTER。

我应该复制这种行为,但是 我对原始模式到底是什么感到非常困惑。

谁能告诉我如何通过原始模式控制输入/输出,或者为什么我上面描述的测试程序的行为是在使用原始模式时发生的?

【问题讨论】:

【参考方案1】:

在原始模式下,字符会直接传递给您的程序。例如,当您在熟模式下键入终端时,您键入的字符会立即在屏幕上回显。在原始模式下,终端会忽略字符(即不回显),并且您的程序具有是否回显它的选项

编辑:***有一篇关于熟食模式的好文章。 http://en.wikipedia.com/wiki/Cooked_Mode 另外请注意,在原始模式下,偶数和相似字符会直接传递给您的程序。

【讨论】:

【参考方案2】:

默认情况下,Unix 风格的 tty(即控制台)驱动程序将在“cooked 模式”下接受输入。在这种模式下,它提供了一定数量的命令行编辑。用户可以输入一行输入内容,可能会删除并重新输入其中的一些内容(但这并不总是有效),并且在用户点击回车之前程序不会看到它。

这可能让人想起硬件终端通过串行线连接到计算机的时代;如果终端处理一些低级编辑,则计算机不必处理。它还免费为琐碎的 C 程序提供一些基本的输入编辑。

相比之下,原始模式 将 TTY 驱动程序设置为在键入时将每个字符传递给程序。程序(在 Unixish 操作系统上)默认以熟模式启动,需要启用原始模式。

过去,如何做到这一点在操作系统之间存在很大差异,尽管如今 POSIX 已经标准化了这些东西。在 Linux 上,您可以阅读文档的“termios”和“tty_ioctl”手册页。基本上,您会得到一个包含 tty 设置的数据结构,修改您关心的部分(特别是启用原始模式),然后将其传回。

另一种可能性是只使用 ncurses 库。它为您抽象出所有这些东西。

【讨论】:

感谢您的描述!我们提供了库来在生模式和熟模式之间切换,所以幸运的是我们不必担心 termios 的东西。让我感到困惑的一件事是,当切换到 raw 时,我再也看不到程序的输入,只能看到来自服务器的消息。我是否必须在输入时明确显示输入,如果需要,如何显示? @theeggman85:是的,在原始模式下,应用程序的工作是回显输入的字符。 (毕竟它们可能并不打算出现在屏幕上——终端驱动程序都知道,它们可能是 vi 导航命令)。 您知道如何打印输入的任何好的教程或示例吗?另外,我仍然对为什么 testclient 仅在当前没有输入任何内容时才会打印消息感到困惑。 不幸的是,没有。我正在查看的代码使用了一些古老的仿真层,因此没有太多帮助。但这很简单——只需读取字符,然后打印即可。

以上是关于对生的和熟的终端模式感到困惑?的主要内容,如果未能解决你的问题,请参考以下文章

对 Spring-Data DDD 存储库模式感到困惑

对启动模式感到困惑

这个程序如何在调试模式下运行? [关闭]

关于如何使用模块模式的困惑

MVC 模式与三层 - 逻辑属于哪里?

对签署 android APK 感到困惑?