先解释一下Shell : Shell是一个功能为命令行解释器的应用程序,连接了用户和Linux内核,让我们能高效和安全地使用Linux内核。
要写一个minishell,我们要先理解它的过程:
读取输入->>命令解析->>创建子进程->>(子进程)程序替换->>(父进程)进程等待
代码及注释如下:
1 //minishell: 2 //命令行解释器: 3 //从标准输入读取数据(scanf) ls -l -a 4 //ls----运行ls命令----ls命令是一个外部程序 5 //创建一个进程,让这个进程运行ls程序(程序替换) 6 //读取输入->>命令解析->>创建子进程->>程序替换->>(父进程)进程等待 7 #include<stdio.h> 8 #include<stdlib.h> 9 #include<unistd.h> 10 #include<ctype.h> 11 #include<errno.h> 12 #include<string.h> 13 #include<fcntl.h> 14 #include<sys/wait.h> 15 16 void Minishell() 17 { 18 //循环执行 19 while(1){ 20 21 //启动格式 22 printf("minishell:"); 23 fflush(stdout); 24 char str[1024]={0}; 25 26 //1.读取输入 ls -a 27 //需要解决的问题: 空格不截断输入 28 //scanf返回值:成功:赋值数量,失败:EOF 29 // %[^ ]---^代表非 []代表字符集,接收所有在 之前的任意字符 30 // %*c---*表示不读入(直接取出缓冲区的下一个字符),%*c的作用是为了丢掉 31 if(scanf("%[^ ]%*c",str)!=1) 32 { 33 getchar(); //接收失败,吸收返回的EOF 34 } 35 // printf("cmd:[%s] ",str); 36 37 //2.解析命令 38 //需要解决的问题:命令分割,存储位置 39 //空格分割命令,模拟命令行参数存储命令 40 char* p = str; 41 char* argv[32] = {NULL}; 42 int argc = 0; 43 while(*p!='