我正在制作一个程序,它应该像linux(ubuntu)中的真实终端一样工作。
我有这个:
int main(int argc, char *argv[]){
char cmd[500];
do{
printf("$ > ");
fgets(cmd, 499, stdin);
//executeCommands(cmd);
}while(strcmp(cmd, "exitn") != 0);
return 0;
}
我想做的是:当我按下向上键时,它应该显示我以前键入的内容,依此类推……如果我按下向键3次,它应该向我显示使用的第三个最新命令,依此类推。
我不太擅长C,但我知道有一个库读出线和一个历史读出线,但我不知道如何使用它们来实现这一点。
提前感谢
考虑使用GNU读线库(混合了可编辑读线功能和历史功能)。它有Readline本身和历史子库的文档。
您将使用readline
函数读取该行,并使用add_history
添加一些";"已接受";行。您可能还想自定义完成符。
花几个小时阅读文档,它用代码示例进行了很好的解释。
(readline
库是GPL许可的,通常在Linux上可用。例如,在Debian上安装libreadline6-dev
包;我不知道readline
是否在Windows上工作。)
您可能不应该在readline
中显式地使用(在程序中)信号(7)-s。如果你这样做了,深入研究文档和源代码。
您可能需要考虑ncurses
库。它使您能够对全屏终端应用程序(如vim
或emacs
)进行编码。
当然,readline
和ncurses
希望输入是伪tty(因此它不能是管道或文件)。阅读tty解密页面,了解更多血腥的详细信息,并参阅termios(3)!
如果您想要一个图形用户界面,请深入了解GTK或Qt。如果你想要一个网络接口,你需要一些HTTP服务器库,比如libonion或Wt(以及许多关于网络相关技术的知识:HTML5、CSS、Javascript、Jquery、AJAX……请参阅w3schools,这是不完美的)