模拟实现shell
实现shell,需要做到以下四点:
- 接收带空格的字符串
- 解析字符串,实现做到遇到空格则发生截断,再将其放入子进程的参数列表
- 创建一个子进程进行进程替换,实现用户的功能
- 父进程等待子进程结束,退出程序
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <unistd.h>
4 #include <string.h>
5 #include <sys/types.h>
6 #include <sys/wait.h>
7
8 char *argv[50];
9 int argc = 0;
10 int falg;
11
12 extern void do_exec(void);
13
14 void do_analysis(char* str, int size)
15 {
16 if(str == NULL)
17 return ;
18 int i = 0;
19 char *ptr = str;
20 while(str[size - 1] == ' '){
21 str[size - 1] = '\0';
22 size--;
23 }
24
25 while(i < size - 1){
26 if((str[i] == ' ') && (i != 0) && (str[i+1] != ' '))
27 {
28 str[i] = '\0';
29 i += 1;
30 argv[argc++] = ptr;
31 ptr = str + i;
32 }
33 else
34 ++i;
35 }
36
37 argv[argc++] = ptr;
38 argv[argc] = NULL;
39
40 do_exec();
41 }
42
43 void do_exec(void)
44 {
45 pid_t pid = fork();
46
47 if(pid < 0)
48 perror("fork"),
49 exit(1);
50 else if(pid == 0)
51 {
52 falg = 1;
53 execvp(argv[0], argv);
54 }
55
56 wait(NULL);
57
58 return ;
59 }
60
61 int main(void)
62 {
63 int falg = 0;
64 while(1){
65
66 int len = 0;
67 char buff[1024] = {0};
68 printf("myshell>");
69 scanf("%[^\n]%*c", buff);
70 do_analysis(buff, strlen(buff));
71 argc = 0;
72 }
73
74 return 0;
75 }
这只是一个基本的shell框架,其中还有许多bug没有处理完,但是可以实现一些基本命令操作,若可以将代码补充或者探讨bug可以发表评论在下方。