请考虑以下代码:
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
void disable_echoing()
{
termios t;
tcgetattr(STDIN_FILENO, &t);
t.c_lflag &= ~ECHO;
tcsetattr(STDIN_FILENO, TCSANOW, &t);
}
int main()
{
sleep(1);
printf("disabling echoing\n");
disable_echoing();
getchar();
}
此程序休眠一秒钟,然后禁用输入字符的回显,然后读取输入字符。
如果在禁用回显后键入输入字符,则不回显该字符。到目前为止,非常好。
如果在禁用回显之前键入输入字符,则会回显该字符。但是这个节目正在睡觉。我的问题是:如果程序正在休眠,那么回音是什么??
我要求这样做的动机是,Windows上的类似程序(显然禁用回显的具体机制不同)表现不同:即使我在程序休眠时键入输入字符,也不会发生回显,然后当程序从睡眠状态唤醒它会在运行能够进行回显的代码(getchar()
)之前禁用回显,因此仍然不会发生回显。
答案 0 :(得分:4)
我的问题是:如果程序正在休眠,那么回音是什么?
通过tty的输入和输出 - 无论是串行端口,虚拟控制台还是pty - 由内核根据该tty的当前配置进行处理。此处理非常复杂,可以包含以下所有功能:
abc^H^H^H
至abc\cba/
(默认关闭,用于无法删除字符的硬拷贝终端)简而言之,内核的tty层正在完成很多工作!它不仅仅是将输入传递给输出。
Windows没有与UNIX系统相同的tty层。它确实有一个控制台,但它的工作方式却截然不同 - 我的理解是它主要用于模拟PC BIOS的文本模式,而不是终端。