C 生的和熟的终端模式的混淆?

C 生的和熟的终端模式的混淆?,c,io,terminal,C,Io,Terminal,我目前有一个聊天客户端,可以成功地与服务器进行通信。我应该修改该行为,以便在收到另一条聊天信息时,提示向下移动(即,通过打印\b删除提示,打印消息,然后重新打印提示,将消息打印在提示的“上方”) 我们获得了一个测试客户端和测试服务器,用于测试此功能,当前当用户有提示但没有键入任何内容时,他们可以接收来自其他用户的消息。当他们开始键入时,缓冲区不会刷新,直到他们键入整个消息并按ENTER键 我应该复制这种行为,但我对原始模式实际上是什么感到非常困惑 有谁能告诉我如何通过raw模式控制输入/输出,或

我目前有一个
聊天客户端
,可以成功地与
服务器
进行通信。我应该修改该行为,以便在收到另一条聊天信息时,提示向下移动(即,通过打印
\b
删除提示,打印消息,然后重新打印提示,将消息打印在提示的“上方”)

我们获得了一个
测试客户端
测试服务器
,用于测试此功能,当前当用户有提示但没有键入任何内容时,他们可以接收来自其他用户的消息。当他们开始键入时,缓冲区不会刷新,直到他们键入整个消息并按ENTER键

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


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

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

编辑:维基百科有一篇关于烹饪模式的好文章。
另外,请注意,在原始模式下,偶数字符和类似字符将直接传递给您的程序。

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

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

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

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


另一种可能是只使用ncurses库。它为您提取了所有这些内容。

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