C 禁用命令行输入
我正在创建一个ncurses程序,它使用AppKit读取系统范围内的击键。为了清除运行程序时在命令行上积累的大量文本,我在退出程序之前执行这行代码C 禁用命令行输入,c,command-line,stdin,ncurses,appkit,C,Command Line,Stdin,Ncurses,Appkit,我正在创建一个ncurses程序,它使用AppKit读取系统范围内的击键。为了清除运行程序时在命令行上积累的大量文本,我在退出程序之前执行这行代码 while((c = getch()) != '\n' && c != EOF) {} 我的问题是,是否有更有效的方法来解决这个问题。例如,在程序执行时禁用命令行输入 编辑: 我运行了一些测试,我的问题似乎根源于usleep,而不是ncurses或AppKit。以下是一个例子: #include <unistd.h>
while((c = getch()) != '\n' && c != EOF) {}
我的问题是,是否有更有效的方法来解决这个问题。例如,在程序执行时禁用命令行输入
编辑:
我运行了一些测试,我的问题似乎根源于usleep,而不是ncurses或AppKit。以下是一个例子:
#include <unistd.h>
int main() {
usleep(5000000);
return 0;
}
#包括
int main(){
美国LEEP(5000000);
返回0;
}
在退出()之前尝试tcflush(STDIN\u FILENO,TCIFLUSH)
根据
tcflush(3)
:
inttcflush(intfd,intqueue\u选择器)代码>
tcflush()
根据队列选择器的值,丢弃写入fd所指对象但未传输的数据,或丢弃接收但未读取的数据:
TCIFLUSH:
刷新已接收但未读取的数据。
tcflush:
刷新写入但未传输的数据。
TCIOFLUSH:
刷新已接收但未读取的数据和已写入但未传输的数据
curses为此提供了一个函数,称为:
flushinp
例程将丢弃任何已删除的类型
已由用户键入,但用户尚未读取
节目
您的两个程序片段没有显示这一点,但ncurses手册页面的上一节建议您首先关闭echo(通过诅咒):
initscr(); cbreak(); noecho();
无论您是否这样做,curses实际上会将终端置于原始模式,并选择是否回显在curses模式下运行程序时键入的字符
使用getch
的第一个片段是curses函数。ncurses尝试将所有输入字符读入自己的缓冲区,并按程序需要的速率进行处理。flushinp
调用告诉它放弃缓冲输入。顺便说一下,您的代码应该使用ERR
进行检查,而不是EOF
,尽管对于大多数诅咒的实现,这些值都是相同的数值
当您的程序停止curses模式(使用endwin
)时,它会将终端恢复到最初的模式,即回显缓冲输入
另一段代码不是curses应用程序。终端保持在熟读模式(回显、缓冲),并累积在终端驱动程序中,程序未读取。退出程序后,下一个程序(或您的shell)将有机会阅读它
正如所建议的(相当含蓄),如果程序退出时未在curses模式下运行,则可以使用tcflush
放弃终端上挂起的输入,这就是ncurses所做的(请参阅)。当程序退出时,应放弃程序运行时终端中的输入。您不需要显式执行此操作。对我来说,这是我退出(0)程序时的命令行:bash-4.4$dddddddd aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa。你想完成什么还不清楚。提供一个包含详细信息的。@Someprogrammerdude如果输入未被程序缓冲,则这不是真的。由于他使用的是ncurses
,因此终端处于原始模式,仅在程序调用输入函数时从终端读取数据,没有缓冲。显示了与问题中的解决方案类似的解决方案。谢谢,它可以工作,但我想知道是否可以完全禁用此功能。我认为这是不可能的。您的应用程序可以很容易地忽略输入,因此终端驱动程序不需要提供这样的功能,因为它无法真正阻止用户从键盘输入。