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 1024
15 #define ARR_SIZE 32
16 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.

linux下实现自己的shell解释器,古老的榕树,5-wow.com

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。