9

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

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

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

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

4

2 回答 2

18

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

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

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

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

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

于 2012-10-27T22:05:02.470 回答
6

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

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

于 2012-10-27T22:04:26.220 回答