关于原始与熟食终端模式的混淆?

时间:2012-10-27 21:44:23

标签: c io terminal

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

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

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

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

2 个答案:

答案 0 :(得分:10)

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

这可能追溯到通过串行线连接到计算机的硬件终端的日子;如果终端处理一些低级编辑,计算机不必。它还免费为普通的C程序提供一些基本的输入编辑。

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

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

另一种可能性是使用ncurses库。它为你摘录了所有这些东西。

答案 1 :(得分:3)

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

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