C 控制台应用程序中的输入事件循环

C 控制台应用程序中的输入事件循环,c,linux,console,console-application,C,Linux,Console,Console Application,我正在尝试制作一个能够将击键作为事件处理的小型控制台应用程序。我需要的主要是能够获得击键,并且能够在不处理典型stdin读取函数的情况下处理击键 我试着检查像mplayer这样的程序的代码,它们实现了这一点(例如停止播放),但我无法用这么大的代码库来了解其核心 感谢您将看到的上述应用程序的核心部分。只需对stdin使用它,就可以确定何时可以从中读取输入。查看您是否有权访问getch()函数。使用此函数,您可以检索单个击键,甚至(CTRL+(char))击键。有了这些数据之后,我想您就可以为这个事

我正在尝试制作一个能够将击键作为事件处理的小型控制台应用程序。我需要的主要是能够获得击键,并且能够在不处理典型stdin读取函数的情况下处理击键

我试着检查像mplayer这样的程序的代码,它们实现了这一点(例如停止播放),但我无法用这么大的代码库来了解其核心


感谢您将看到的上述应用程序的核心部分。只需对stdin使用它,就可以确定何时可以从中读取输入。

查看您是否有权访问getch()函数。使用此函数,您可以检索单个击键,甚至(CTRL+(char))击键。有了这些数据之后,我想您就可以为这个事件创建一个处理程序了。因此,您可以实现一个索引/函数ptr对表,使用击键作为索引,并为每个索引分配一个函数指针来处理该事件。希望这对您有所帮助。

您可以使用链接中显示的ncurses函数系列“”,这里还有一个对您有帮助的函数,顺便说一句,应该指出,ncurses是平台可移植的,因此如果您决定将目标重新定位到另一个平台(这是一个巨大的优势),您应该对此非常满意。

要将stdin更改为在按下enter键之前不缓冲,您可以像这样乱弄终端i/o设置

struct termios oldopts;
struct termios newopts;

tcgetattr(fileno(stdin), &oldopts);
newopts = oldopts;
newopts.c_lflag &= (~ICANON & ~ECHO);
tcsetattr(fileno(stdin), TCSANOW, &newopts);
termios结构以及tcgetattr()和tcsetattr()原型位于termios.h文件中。

然后,您可以使用select()检查字符是否已准备好读取。

它必须是跨平台的吗?这很好:)但linux是主要平台默认情况下,您只能在收到完整行后从stdin读取,因此select也将返回。您还需要禁用行缓冲。