- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在用 C 语言编写一个简单的客户端-服务器程序来练习网络编程。服务器可以使用多线程处理多个客户端。每个客户端都在单独的线程中提供服务。客户端使用两个线程:一个从标准输入获取用户输入,另一个打印到标准输出。
我用常规文本测试了该程序,它运行得很好。然而,当我输入箭头键时,它的行为非常奇怪(左键 = ^[[D,右键 = ^[[C,向上键 = ^[[A,向下键 = ^[[B)。
例如,请参阅以下输出:这是我按顺序发送的输入(在客户端中):
>> test
I got your message
>> test1
I got your message
>> test2
I got your message
>> test3
I got your message
这是服务器中的(正确)输出:
Here is the message: test
Here is the message: test1
Here is the message: test2
Here is the message: test3
现在我输入随机箭头键(输入test3后):
>>^[[D^[[A^[[C^[[A^[[D^[[C^[[A^[[D^[[B^[[C^[[D^[[B^[[D^[[C^[[A^[[D^[[C^[[A^[[D^[[A^[[D^[[C^[[A
I got your message
但是,服务器不打印任何内容(我假设字符已转义):
Here is the message: test
Here is the message: test1
Here is the message: test2
Here is the message: test3
Here is the message:
Now, I start inputting normal text:
>> test4
I got your message
>> test5
I got your message
>> test6
I got your message
>> test7
I got your message
>> test8
I got your message
>> test9
I got your message
>> test10
I got your message
当我检查服务器的标准输出时,所有先前的打印输出都被覆盖:
Here is the message: test4
Here is the message: test5
Here is the message: test6
Here is the message: test7
Here is the message: test8
Here is the message: test9
Here is the message: test10
最重要的是,行为会随着我输入的箭头的随机击键而改变。有时,输入不会覆盖服务器的标准输出,但会将输入插入标准输出中。
我不确定为什么会发生这种情况,但是,如果有人想查看我的来源,我可以发布它。源代码并不长 - 客户端和服务器大约 100 行长。
<小时/>好的,我分别测试了每个键。
向下键和向上键似乎按行移动标准输出中的文件指针。而且左右键似乎没有任何作用。
最佳答案
您将 stdout
(这是字节流)与将这些字节输入终端模拟器的结果混淆了。如果您捕获了服务器的stdout
到文件中,您将能够使用十六进制编辑器(或 hd
命令)查看它,并且您将看到发送的实际字节。
终端仿真器获取这些字节并将它们转换为操作,从而导致您的显示屏向您显示某些内容。字节或字节序列可以显示为单个字素(可见符号)或解释为控制代码(移动光标、更改输出或背景颜色等),甚至只是被忽略。
要了解如何解释这些字节,您可以查阅终端仿真器的文档(如果可以找到)或尝试 XTerm documentation 中的有用摘要。 (这是特定于 xterm
但大多数现代终端模拟器都是类似的)或 man 4 console_codes
(这是特定于 Linux 控制台的,但又与大多数终端模拟器类似)。
关于c - 为什么箭头键会弄乱标准输出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34002650/
我是一名优秀的程序员,十分优秀!