【问题标题】:How to check whether up and down button is clicked or not in native C如何在本机C中检查是否单击了向上和向下按钮
【发布时间】:2017-11-03 19:44:56
【问题描述】:

我正在创建一个小 shell,它使用 fork 和 exec 命令在 ubuntu 中执行 linux bash 命令。单击向上按钮时我需要带上以前的命令,单击向下按钮时需要带下一个命令,与终端相同。如何使用原生 C 语言做到这一点?

我的意思是我需要像在面向对象中的监听器一样一直扫描向上和向下按钮。

【问题讨论】:

  • getch and arrow codes的可能重复
  • 你需要修改连接到你的shell的终端来给你这样的键序列。这通常是在termcap (terminal capabilites) 的帮助下完成的。如果您搜索术语termcap,您应该能够找到大量有关如何使用它的示例。在它的帮助下,终端会将诸如向上或向下光标之类的键作为特殊序列发送到您的应用程序,您可以在阅读时检测到这些键,并酌情处理。
  • @yakout 我认为这是在询问如何实现 UI 和回调以读取按钮消息。
  • 或者,您知道,使用诸如 the GNU readline library 之类的库(存在于所有主要的 Linux 发行版上),它将帮助您处理所有这些事情(该库甚至有自己的内置历史功能,这似乎是你所追求的)。
  • 感谢所有回复。我想我在这些 cmets 中找到了不止一种方法来做到这一点,谢谢。

标签: c linux listener


【解决方案1】:

如果这是一个用于教育目的的小项目,您可以尝试查看tcgetattr(手册页非常具有描述性)。

这是正确配置的示例:

#include <termios.h>
#include <unistd.h>

struct termios old_term;

void set_new_term() {
  struct termios new_term;

  tcgetattr(STDIN_FILENO, &old_term);
  tcgetattr(STDIN_FILENO, &new_term);

  new_term.c_lflag &= (~ICANON & ~ECHO);
  new_term.c_cc[VMIN] = 0;
  new_term.c_cc[VTIME] = 0;
  tcsetattr(STDIN_FILENO, TCSAFLUSH, &new_term);
}

别忘了在退出前恢复旧的终端设置(使用tcsetattr(STDIN_FILENO, TCSANOW, &amp;old_term)

所以想法是设置非规范模式。

在非规范模式下,输入立即可用(无需用户 必须键入一个行分隔符),没有输入处理 执行,并且行编辑被禁用。

现在,当您使用完终端后,您需要跟踪表单的所有字符串

str[0] = '\x1b'
str[1] = '['
str[2] = 'A' or 'B' or 'C' or 'D' /* A - for up
                                     B - down
                                     C - right
                                     D - left  */

再一次,所有这些只有在你想玩得开心时才有用,但总的来说,我认为 readline 是一个很好的解决方案。甚至在 ubuntu 上还有 rlwrap

rlwrap 运行指定的命令,拦截用户输入以便 提供 readline 的行编辑、持久化历史记录和补全。

所以你可以运行:

$> rlwrap your_program_name

【讨论】:

猜你喜欢
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-11
相关资源
最近更新 更多