struct termios C中的未知行为

时间:2013-03-12 05:40:26

标签: c

使用此代码,当我接受输入时,输入不会出现,当我将其注释出来时,此代码在下面执行的是什么,

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);

2 个答案:

答案 0 :(得分:1)

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

将重置echo和规范输入标志。如果您不想重置echo标志(但保留其他所有内容),只需使用:

newConfig.c_lflag &= ~(ICANON);

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

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

非caconical输入为您输入每个字符(当您点击 ENTER 时,而不是整行),非常适合编辑。如果您的编辑需要处理像 CTRL-W 这样的内容来向前移动一个单词,那么您可能不希望它在屏幕显示的中间敲打^W

相反,您希望它将输出保留到程序,而不是终端接口。非规范的非回声终端I / O可以为您提供更多的功能。

答案 1 :(得分:0)

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