linux下實現自己的shell解譯器

來源:互聯網
上載者:User

標籤:style   blog   color   os   io   for   ar   2014   

實現一個自己的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個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.