对于一个类项目,我们必须实现一个基本的Linux shell。就目前而言,除了“UP”键之前的命令滚动功能外,我还有一切工作要完全实现基本功能。
这样的事情怎么可能实施?我意识到它可能就像在输入字符串中保留char*
数组一样简单,但我们如何捕获“UP”按键按下?
一旦我们实现了上述功能,如何在不使其成为永久性的情况下写入stdout?也就是说,当你再次按下“UP”时,它会删除之前用另一个命令写的内容。
答案 0 :(得分:2)
实现 up 键的一种实用方法是使用GNU readline库(及其history
子库)。顺便说一句,有些shell确实使用GNU readline(它是在GPL许可下)。而且你也会得到行版。您可以使用选项卡键等实现完成。
还有其他方法,例如使用ncurses
或termcap
等...或在原始终端上发出ANSI escape codes。另见the tty demystified& termios(3) ...
答案 1 :(得分:1)
如果你直接从STDIN使用非缓冲的逐字符输入(这意味着,除了其他方面,控制字符,如CTRL + C不会自动处理),那么你将逐字节读取。与ASCII符号不同,箭头键在STDIN上放置了多个字节,因为它们是excape sequences。这些字节因系统而异。确定系统转义序列的最简单方法是执行不带参数的cat
命令,然后按箭头键。将显示类似^[[A
的内容,您需要将该序列从ASCII转换为十六进制字节。
完成上述操作后,您可以使用get_char()
逐个读取一个字节,就像您可能已经在输入功能中一样。