mybash的简单实现
fgets与gets的区别
fgets会读取到我们的回车符\n
gets不会读取到\n
bash只是帮你执行程序不包含程序
stork()函数
系统提供的方法strtok在<string.h>中
它会将数组里的分隔符全部换为\0(字符数组首地址)内部有全局变量的指针记录分隔的位置返回cp的地址a.c的地址b.c的地址;
第一次输入首位置第二次都是NULL在原来的字符串上直接分割
margv[]存放各个字段的数组数组;替换的参数
1 #include<stdlib.h>
2 #include<assert.h>
3 #include<stdio.h>
4 #include<unistd.h>
5 #include<string.h>
6 #include<fcntl.h>
7 #include<sys/wait.h>
8 char* Get_cmd(char buff[],char*myargv[])
9 {
10 if(buff==NULL||myargv==NULL)
11 {
12 return NULL;
13 }
14 int i=0;
15 char*s=strtok(buff," ");//分隔的地方变为\0
16 while(s!=NULL)
17 {
18 myargv[i++]=s;
19 s=strtok(NULL," ");
20 }
21 return myargv[0];
22 }
23
24 int main(int gra,char*argv[],char*envp[])
25 {
26 while(1)
27 {
28 char buff[128]={};
29 printf("\033[1;32mstu@stu-virtual-machine:\033[0m~$");
30 fflush(stdout);
31 fgets(buff,128,stdin);
32 buff[strlen(buff)-1]=0;//"\0"fget会把\n也获得
33 char*myargv[10]={};
34 char*cmd= Get_cmd(buff,myargv);
35 if(cmd==NULL)
36 {
37 continue;
38 }
39 else if(strcmp(cmd,"exit")==0)
40 {
41 break;
42 }
43 else if(strcmp(cmd,"cd")==0)
44 {
45 //chdir();
46 }
47 else
48 {
49 //fork+exec
50 pid_t pid=fork();
51 if(pid==-1)
52 {
53 printf("fork erro\n");
54 continue;
55 }
56 if(pid==0)
57 {
58 execvp(cmd,myargv);
59 printf("execvp erro\n");
60 exit(0);
61 }
62 wait(NULL);
63 }
64 }
65 exit(0);
66 }
内置命令
exit和cd和其他的命令不同
注意\033只是一个字符
尝试增加功能
cd 还有第一行的当前位置的打印
看书Linux程序设计第三四章