迷你shell实现
shell:命令行解释器,就是对我们输入的命令进行解释,实现命令功能
思路
- 1、等待标准输入
- 2、解析输入数据
- 3、判断是否内建命令
- 4、创建子进程进行程序替换
- 5、回收子进程
具体代码实现
1 //shell
2 //1、等待用户输入
3 //2、解析输入数据 【ls】【-l】
4 //3、创建子进程
5 //4、等待子进程退出(重复)
6 #include<stdio.h>
7 #include<stdlib.h>
8 #include<unistd.h>
9 int main()
10 {
11 while(1){
12 //打印界面
13 printf("[zhangxu@localhost]$ ");
14 fflush(stdout);// 刷新缓冲区,直接打印界面
15 //等待标准输入
16 char buf[1024];
17 if(scanf("%[^\n]%*c",buf) != 1){
18 getchar();
19 continue;
20 }
21
22 //解析用户输入
23 char* argv[32];
24 int argc = 0;
25 char* ptr = buf;
26
27 while(*ptr != '\0') {
28 if (!isspace(*ptr)) {
29 //当前位置是非空白字符
30 argv[argc++] = ptr;
31 while(!isspace(*ptr) && *ptr != '\0') {
32 ptr++;
33 }
34 }
35 *ptr = '\0';
36 ptr++;
37 }
38 //创建子进程
39
40 argv[argc] = NULL;
41 //判断命令是否是内建命令
42 if(strcmp(argv[0], "cd") == 0) {
43 //int chdir(const char *path);
44 //改变当前工作路径
45 chdir(argv[1]);
46 continue;
47 }
48 //创建子进程---执行任务
49 int pid = fork();
50 if (pid < 0) {
51 continue; //创建失败,继续创建
52 }else if(pid==0){
53 if(execvp(argv[0],argv)<0){
54 perror("");
55 }
56 exit(0); //程序替换失败,退出
57 }
58 else{
59 //父进程等待,避免僵尸进程
60 wait(NULL);
61 }
62 }
63 return 0;
64 }
总结
- 实现这个迷你shell其实并不是特别难,只要你能将思路捋清楚,一步步实施就没有很大的问题,但再这里我还是要再说明一下,本次代码实现中引入了缓冲区的概念还是值得我们去关注下的,刚开始我也是有很多疑惑,了解了缓冲区后,才豁然开朗,关于缓冲区的问题我将会再进行文件操作时与大家分享。大家也不妨可以实现一下这个迷你shell,还是挺有意思的,对于我们新手来说还是有很大帮助的。