我正在创建一个ncurses程序,它使用AppKit读取系统范围的击键。为了清除在运行程序时累积在命令行上的文本墙,我在退出程序之前执行这行代码。
while((c = getch()) != '\n' && c != EOF) {}
我的问题是,是否有更有效的方法来解决这个问题。例如,在程序执行时禁用命令行输入。
编辑:
我运行了一些测试,我的问题似乎根源于usleep而不是ncurses或AppKit。这是一个例子:
#include <unistd.h>
int main() {
usleep(5000000);
return 0;
}
答案 0 :(得分:3)
在tcflush(STDIN_FILENO, TCIFLUSH)
之前尝试exit()
。
根据tcflush(3)
:
int tcflush(int fd, int queue_selector);
tcflush()
会丢弃写入fd
引用的对象但未传输的数据,或已接收但未读取的数据的数据,具体取决于queue_selector
的值:
TCIFLUSH :
刷新收到但未读取的数据TCOFLUSH :
刷新写入但未传输的数据TCIOFLUSH:
刷新收到但未读取的数据,写入但未传输的数据。
答案 1 :(得分:2)
curses为此提供了一个名为flushinp
的函数:
flushinp
例程会抛弃任何有类型的类型 由用户输入并且尚未被读取 程序
你的两个程序片段没有显示这个,但是initialization上的ncurses手册页的部分建议你最初关闭echo(通过curses):
initscr(); cbreak(); noecho();
无论你是否这样做,curses实际上将终端置于原始模式,并选择是否在程序以curses模式运行时回显键入的字符。
使用getch
的第一个片段是curses函数。 ncurses尝试将所有输入字符读入其自己的缓冲区,并按照程序所需的速率处理它们。 flushinp
调用告诉它放弃缓冲输入。顺便说一句,您的代码应使用 ERR
进行检查,而不是 EOF
,但对于大多数curses实现,这些数字值都是相同的
当你的程序停止curses模式(使用endwin
)时,它会将终端恢复到最初的模式,即回显缓冲输入。
代码的另一个片段不是curses应用程序。终端保持熟化模式(回显,缓冲),并累积在终端驱动程序中,由程序读取。退出程序后,下一个程序(或你的shell)有机会阅读它。
正如建议(相当暗示)如果您的程序在退出时未以curses模式运行,您可以使用POSIX termios call tcflush
来放弃待处理的输入终端,这是ncurses的作用(见source)。