繁体   English   中英

C禁用命令行输入

[英]C Disable command-line input

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

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

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

编辑:

我进行了一些测试,但问题似乎出在usleep而不是ncurses或AppKit。 这是一个例子:

#include <unistd.h>

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

exit()之前尝试tcflush(STDIN_FILENO, TCIFLUSH) exit()


根据tcflush(3)

int tcflush(int fd, int queue_selector);

tcflush()丢弃数据写入到由所引用的对象fd但不发送,或接收的数据,但不能读取,这取决于的值queue_selector

TCIFLUSH :刷新已接收但未读取的数据。
TCOFLUSH :清除已写入但未传输的数据。
TCIOFLUSH:刷新已接收但未读取的数据,以及已写入但未传输的数据。

curses为此提供了一个功能,称为flushinp

flushinp例程会丢弃用户已键入但尚未被程序读取的任何预输入。

您的两个程序片段没有显示此内容,但是ncurses手册页上有关初始化的部分建议您首先关闭echo(按curses):

initscr(); cbreak(); noecho();

无论您是否执行此操作,curses实际上都会使终端进入原始模式,并选择是否在程序以curses模式运行时回显键入的字符。

使用getch的第一个片段是curses函数。 ncurses尝试将所有输入字符读入其自己的缓冲区,并以程序所需的速率处理它们。 flushinp调用告诉它丢弃该缓冲的输入。 顺便说一句,您的代码应使用ERR进行检查,而不是EOF ,尽管对于curses的大多数实现,这些都是相同的数值。

当程序停止curses模式(使用endwin )时,它将使终端回到最初的模式,即回显缓冲的输入。

代码的另一个片段不是curses应用程序。 终端保持在熟模式 (回显,缓冲),并且累积在终端驱动程序中,程序未读取。 从程序退出时,下一个程序(或您的Shell)将有机会阅读该程序。

作为建议(而隐含的),如果你的程序是不是在诅咒模式下运行它退出时,您可以使用POSIX termios的通话 tcflush丢弃输入端子,这就是它的ncurses(见未决 )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM