实现屏蔽^c信号,只要这一行代码
signal(SIGINT,SIG_IGN);
补全功能和移动光标,命令切换____readline库
自动补全这个功能需要用Readline 库 ,没有的话需要安装,至于如何使用readline推荐这篇帖子点一点
sudo apt-get install libreadline6-dev
因为readline 是动态链接库 所以 ,编译的时候 需要加上 -lreadline
gcc chengxi -lreadline
要加头文件
#include<readline/readline.h>
实现命令切换
头文件
#include<readline/history.h>
同样,编译的时候也需要加上 -lreadline
add_history(str);
每次将所读取的命令加到 add_history()中.
完整操作
memset(buf,0,256);
print_prompt(); // 打印提示符
char *str = readline("\033[37mSSX)\033[0m$ ");
add_history(str);
strcpy(buf,str);
cd命令,cd -,cd ~,cd path
if(strncmp(arg[0],"cd",2) == 0){
if(argcount == 1){
strcpy(past,aaa);
chdir("/home/sunxiaochuan/");
return ;
}
if(strncmp(arg[1],"~",1) == 0 || argcount == 1){
strcpy(past,aaa);
chdir("/home/sunxiaochuan/");
return ;
}
else if(strncmp(arg[1],"-",1) == 0){
if(past[0] == '\0' && past[1] == '\0'){
printf("ERROR: wrong command about cd\n");
return ;
}
else{
if(chdir(past) == -1){
printf("bash: cd: %s: 没有那个文件或目录\n",arg[1]);
}
}
}
else if(argcount == 2){
strcpy(past,aaa);
if(chdir(arg[1]) == -1){
printf("bash: cd: %s: 没有那个文件或目录\n",arg[1]);
}
}
return ;
}
ls自带颜色
自动检测ls命令,然后加上参数 --color
if(strcmp(arg[0],"ls") == 0){
strcpy(arglist[argcount],"--color");
arg[argcount] = (char *)arglist[argcount];
argcount = argcount + 1;
arg[argcount] = NULL;
}
else{
arg[argcount] = NULL;
}
主程序代码如下,具体实现注释说的比较清楚
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h> // exit
#include <string.h>
#include <fcntl.h> // O_RDWR
#include <dirent.h> // DIR, struct dirent
#include <sys/wait.h>
#include <wait.h>
#include <sys/stat.h>
#include <sys/types.h>
#include<readline/readline.h>
#include<readline/history.h>
#define BUFFSIZE 64
#define normal 0 // 一般的命令
#define out_redirect 1 // 输出重定向
#define outtwo_redirect 4 //>>
#define in_redirect 2 // 输入重定向
#define have_pipe 3 // 命令中有管道
void print_prompt(); // 打印提示符
// 二维数组作为函数参数,第1维长度可以不指定,但必须指定第2维长度
// 也可使用指向含8个元素一维数组的指针,char (*a)[8]
void explain_input(char *, int *, char a[][256]); // 解析输入的命令
void do_cmd(int, char a[][256]); // 执行命令
int find_command(char *); // 查找命令中的可执行程序
char aaa[256];
char past[256];
int main(int argc, char *argv[])
{
signal(SIGINT,SIG_IGN);
char arglist[100][256];
int argcount = 0;
char *