Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 禁用命令行输入_C_Command Line_Stdin_Ncurses_Appkit - Fatal编程技术网

C 禁用命令行输入

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>

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

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
,因此终端处于原始模式,仅在程序调用输入函数时从终端读取数据,没有缓冲。显示了与问题中的解决方案类似的解决方案。谢谢,它可以工作,但我想知道是否可以完全禁用此功能。我认为这是不可能的。您的应用程序可以很容易地忽略输入,因此终端驱动程序不需要提供这样的功能,因为它无法真正阻止用户从键盘输入。