C禁用命令行输入

时间:2017-01-09 15:27:48

标签: c command-line stdin ncurses appkit

我正在创建一个ncurses程序,它使用AppKit读取系统范围的击键。为了清除在运行程序时累积在命令行上的文本墙,我在退出程序之前执行这行代码。

while((c = getch()) != '\n' && c != EOF) {}

我的问题是,是否有更有效的方法来解决这个问题。例如,在程序执行时禁用命令行输入。

编辑:

我运行了一些测试,我的问题似乎根源于usleep而不是ncurses或AppKit。这是一个例子:

#include <unistd.h>

int main() {
    usleep(5000000);
    return 0;
}

2 个答案:

答案 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)。