[英]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.