【问题标题】:How to instantly react to key pressing in C?如何立即对 C 中的按键做出反应?
【发布时间】:2013-03-27 09:32:33
【问题描述】:

我试图在用户按下一个键时调用一个函数,有点像用 Ctrl-C 发送信号。这个想法是做某事,说在一个while循环中,并积极地听,比如说,被按下的'f'键。当按下它时,程序将停止执行循环并执行其他操作,因为按下了 'f' 键。

有没有办法自定义信号映射?我没有太多运气。似乎还有 1 或 2 个可用于自定义的信号,但我需要 3 个。

如果我使用 getchar(),用户需要按“f”键,然后按回车键。我希望他们只需按“f”键而不必按回车键。

这与使用 unix 的 more 程序非常相似,用户只需按空格键即可浏览页面。

非常感谢任何帮助!

【问题讨论】:

  • Windows 有钩子的概念。我不知道 Unix 有什么,但这可能会帮助你找到你想要的。
  • 是的,我正在 Unix 中寻找它。
  • 看起来你有 ncurses 或 this。供参考:stackoverflow.com/questions/3392291/…
  • 我有一个使用 termios here 进入和退出 RAW 模式的示例。
  • 您可以更改您的终端设置以使用stty intr f 发送和中断信号,尽管在大多数正常情况下这可能会让您发疯。

标签: c unix terminal keypress


【解决方案1】:

如果由于某种原因你不喜欢 ncurses,你可以试试下面的方法。

您可以使用一个单独的线程,该线程在stdin 上使用select(),然后在stdin 上执行read() 并解析用户输入;如果关键是您要查找的内容,请向您的主线程发送一个信号(即USER1USER2 未使用)。在您的信号处理程序中,执行您希望对中断执行的任何操作。请注意,这样做意味着您的代码必须是可中断的,因此中断不会中断您的计算。

【讨论】:

    【解决方案2】:

    到目前为止,最简单的选择是使用ncurses

    但是,如果这不可接受,POSIX(因此也包括 Linux)定义了一系列用于“终端控制”的例程——名称以 tc 开头,包括:

    在这种情况下,您主要需要tcgetattr()tcsetattr()。您需要研究tcgetattr()tcsetattr() 定义中的限制,并且需要研究<termios.h> 标头中的结构和标志。例如,查看 ICANON 本地模式:您可能希望将其关闭,以便在输入字符后立即读取字符。

    【讨论】:

      猜你喜欢
      • 2015-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-22
      • 2021-09-10
      • 2018-07-14
      • 2013-01-06
      • 1970-01-01
      相关资源
      最近更新 更多