我正在创建一个shell,它使用fork和exec命令在ubuntu中执行linux bash命令。我需要在单击向上按钮时带上前面的命令,当点击向下按钮与终端相同时需要带下一个命令。如何使用本机C语言执行此操作?
我的意思是我需要像面向对象的向上和向下按钮的监听器那样一直扫描。
答案 0 :(得分:0)
如果它是一个用于教育目的的小项目,您可以尝试查看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, &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