【发布时间】:2020-10-16 16:59:42
【问题描述】:
我正在尝试以终端原始模式读取用户的输入表单。
这是启用原始模式并禁用一些转义字符和所有字符的函数。它还引用了 disableRawMode ,用于在读取输入后重新进入规范模式:
void enableRawMode() {
if (tcgetattr(STDIN_FILENO, &orig_termios) == -1)
die("tcgetattr");
atexit(disableRawMode);
struct termios raw = orig_termios;
raw.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
raw.c_oflag &= ~(OPOST);
raw.c_cflag |= (CS8);
raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);
raw.c_cc[VMIN] = 0;
raw.c_cc[VTIME] = 1;
if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw) == -1)
die("tcsetattr");
}
还有一些其他函数(editorReadKey & editorprocessKeypress)来读取按键并处理字符输入:
char editorReadKey() {
int nread;
char c;
while ((nread = read(STDIN_FILENO, &c, 1) != 1)) {
if (nread == -1 && errno != EAGAIN)
die("read");
}
}
void editorProcessKeypress() {
char c = editorReadKey();
switch (c) {
case CTRL_KEY('q'):
exit(0);
break;
}
}
但是当我调用主程序中的函数时:
int main(void) {
enableRawMode();
while (1) {
editorRefreshScreen();
editorProcessKeypress();
}
return 0;
}
我的终端刚刚死机,我必须重新启动它才能让它恢复工作。有什么理由说明为什么会发生这种情况?
【问题讨论】:
-
“编译时”和“运行时”是有区别的。
-
如果您在
main()内的无限循环中插入输出,您多久会看到该输出? -
很抱歉。碰巧英语不是我的第一语言,我还在习惯它。编辑了问题。
-
@Yunnosch 我只使用无限循环,因为我想读取输入直到按下“q”。在这种情况下,我想循环将终止。
-
你不会从
editorReadKey()返回任何东西,C 编译器只是接受它。这意味着您的任何密钥处理都不会触发,因此您的代码永远不会做任何事情,因此看起来很冻结。始终使用-Wall构建 C 代码