实现minishell的主要步骤如下:
1.获取标准输入中的字符串;
2.解析输入得到的命令名称和运行参数;
3.创建子进程,在子进程中进行程序替换
4.进程等待
下面是实现代码
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<fcntl.h>
5 #include<sys/wait.h>
6
7 int main()
8 {
9 while(1)
10 {
11 char buf[1024]; //定义一个缓冲区获取用户输入
12 printf("[User@localhost]$ ");
13 fflush(stdout);
14 if(scanf("%[^\n]%*c",buf) != 1) //由于scanf读取到空白字符就停止,所以利用
//%[^\n]可以让其读取到\n为止,而%*c是从缓冲区取出一个字符
15 {
16 getchar();
17 continue;
18 }
19 printf("buf[%s]\n",buf);
20 int argc = 0;
21 char* argv[32];
22 char* ptr = buf;
23 while(*ptr)
24 {
25 if(!isspace(*ptr))
26 {
27 argv[argc] = ptr; //走到不是空格的字符处,将它的地址保存
28 argc++;
29 }
30 while(!isspace(*ptr) && *ptr != '\0')
31 {
32 ptr++;
33 }
34 *ptr = '\0'; //某一个指令字符走完之后,在其后面加上\0
35
36 ptr++; //遍历整个输入的字符串
37 }
38 argv[argc] = NULL; //遍历完整个字符串之后在其末尾加上NULL
39 if(strcmp(argv[0],"cd") == 0) //由于cd是内建命令,所以如果是的或就直接执行
40 {
41 chdir(argv[1]);
42 continue;
43 }
44 pid_t pid = fork(); //创建子进程
45 if(pid < 0)
46 {
47 perror("fork");
48 }
49 if(pid == 0)
50 {
51 execvp(argv[0],argv); //程序替换
52 exit(1);
53 }
54 wait(NULL); //父进程等待子进程退出防止其成为僵尸进程
55 }
56 return 0;
57 }
其中用到的isspace函数可以用来判断是否为空格字符,如果是则返回真。