-3

使用此代码,当我输入时,输入不会出现,当我将其注释掉时,它会出现,这段代码在下面做什么,

struct termios origConfig;
tcgetattr(0, &origConfig);
struct termios newConfig = origConfig;
newConfig.c_lflag &= ~(ICANON|ECHO);
newConfig.c_cc[VMIN] = 1;
newConfig.c_cc[VTIME] = 1;
tcsetattr(fileno(stdin), TCSANOW, &newConfig);
4

2 回答 2

1
newConfig.c_lflag &= ~(ICANON|ECHO);

将重置 echo 和 canonical-input 标志。如果您不想重置回显标志(但保留其他所有内容),只需使用:

newConfig.c_lflag &= ~(ICANON);

尽管您可能还想检查规范输入标志的工作原理。例如,请参阅Linux termios 手册页

在任何情况下,使用一个而不使用另一个可能是不明智的,因为非规范输入的主要用例之一是编辑器之类的东西,您希望字符回显。

非 caconical 输入为您提供输入的每个字符(而不是当您点击 时的一整行ENTER),非常适合编辑。如果您的编辑器需要处理诸如CTRL-W向前移动一个单词之类的事情,您可能不希望它^W在屏幕显示中间敲击。

相反,您希望它把输出留给程序,而不是终端接口。非规范、非回显终端 I/O 为您提供了更多的接口功能。

于 2013-03-12T05:46:21.013 回答
0

tcsetattr()函数控制用户终端的行为。在这种特殊情况下,代码会清除ECHO控制结构中的标志(newConfig.c_lflag &= ~ECHO这样做),因此不会回显用户键入的内容。

于 2013-03-12T05:42:48.943 回答