首页 > 代码库 > linux下实现自己的shell解释器
linux下实现自己的shell解释器
实现一个自己的shell解释器,其原理比较简单,首先获取用户的输入,通过fork()函数获取两个进程(父子进程),子进程通过execvp()函数继续进行,此时父进程一直在等待子进程的结束,待都结束了就执行了一次shell解释。
1 /*============================================ 2 > Copyright (C) 2014 All rights reserved. 3 > FileName:my_shell.c 4 > author:donald 5 > date:2014/08/21/ 16:08:03 6 > details: 7 ==============================================*/ 8 #include <unistd.h> 9 #include <stdio.h>10 #include <stdlib.h>11 #include <string.h>12 #include <sys/wait.h>13 #include <sys/types.h>14 #define N 102415 #define ARR_SIZE 3216 int save_to_arg(char line[N],char *arg[N]){17 memset(arg,0,sizeof(arg));18 int head,tail;19 char temp[ARR_SIZE];20 int pos,index;21 index = 0;22 head = 0;23 while(line[head] != ‘\0‘){24 while(line[head] == ‘ ‘ && line[head] != ‘\0‘){25 head ++;26 }27 if(line[head] == ‘\0‘){28 break;29 }30 tail = head;31 while(line[tail] != ‘ ‘ && line[tail] != ‘\0‘){32 tail ++;33 } 34 35 pos = 0;36 memset(temp,0,ARR_SIZE);37 while(head != tail){38 temp[pos] = line[head];39 head ++;40 pos ++;41 }42 43 arg[index] = (char*)calloc(1,strlen(temp));//arg是一个指向字符数组的指针,必须申请空间
//如果声明arg为一个二维数组就不用为其分配44 strcpy(arg[index],temp);45 46 index ++;//!!!!!!!!!47 }48 arg[index] = NULL;49 return index;50 }51 int main(int argc, const char *argv[])52 {53 int index,len;54 char *arg[N];55 char line[N];56 while(memset(line,0,N),printf(">>"),fgets(line,N,stdin) != NULL){57 line[strlen(line)-1] = ‘\0‘;58 if(line[0] == ‘\n‘){59 continue;60 }61 len = save_to_arg(line,arg);62 63 if(fork() == 0){64 if(execvp(arg[0],arg) == -1){65 perror("error");66 }67 }else{68 wait(NULL);69 }70 }71 return 0;72 }
- execvp()函数非正常退出将会返回 -1 ,通过获取其值,并对其加以判断,就可以实现在用户输入shell中没有的指令时出现提示消息。
- 在键入ls时为了实现颜色,可以进行如下操作,eg:ls -l --color=auto.
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。