shell是一个命令行解释器,但很多人并不能很好地去理解它,但如果你能看懂这个简易的shell实现,问题就迎刃而解。
1.shell是一个命令行解释器。
2.它是一个程序,用来捕捉命令,并不会执行
3.shell是用户能和内核更好了交流的程序
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<sys/wait.h>
5 #include<string.h>
6 int main(){
7 while(1){
8 printf("[user@localhost path]$ ");
9 fflush(stdout);
10 //这里不能用换行刷新缓冲区,否则输入就另起一行
11 char scan[1024]={
0};
12 fgets(scan,1024,stdin);
13 //这一步一定要-1,因为输入的时候会输入一个回车,这一步把回车替换
14 scan[strlen(scan)-1]='\0';
15
16 char* idx=scan;
17 char* myagv[10]={
NULL};
18 int myagc=0;
19 while(*idx!='\0'){
20 if(*idx!=' '){
21 myagv[myagc]=idx;
22 ++myagc;
23 while(*idx!='\0'&&*idx!=' '){
24 ++idx;
25 }
26 *idx='\0';
27 ++idx;
28 }
29 myagv[myagc]=NULL;
30 }
31
32 //cd命令是shell本身实现
33 if(strcmp("cd",myagv[0])==0){
34 chdir(myagv[1]);//chdir系统调用接口实现切换目录
35 continue;
36 }
37
38 //开始创建进程
39 pid_t pid=fork();
40 if(pid<0){
41 perror("make error");
42 }
43 if(pid==0){
44 execvp(myagv[0],myagv);
45 //用myagv指针数组来存输入内容,选execvp
46 perror("error");
47 exit(-1);
48 }
49 waitpid(-1,NULL,0);//进程等待
50
51
52 }
53 return 0;
54 }
我们可以看到minishell帮我们实现了进程的创建,替换等待和退出,这就是shell工作的模式,当然,实际的shell更加复杂和多功能,希望对你有帮助。