2015-05-11 54 views
1

我正在寫一個C語言的小shell來學習有關linux和C的知識。現在我可以執行自定義命令和退出命令,但是我不能執行內置的CD命令,因爲我不知道如何將其分成兩部分(cd命令和CD目錄的名稱)。如何擴展我的功能以使其具有cd命令?

所需的功能是我的程序應該接受cd命令,其參數是目錄。我可以通過命令行參數來做到這一點,但我不知道如何以目前的形式進行操作。如何做呢?

#include <sys/stat.h> 
#include <stdio.h> 
#include <unistd.h> 
#include <string.h> 
#include <dirent.h> 
#include <errno.h> 
#include <stdarg.h> 
#include <stdlib.h> 
#include <signal.h> 
#include <sys/types.h> 
#include <sys/wait.h> 

#define BUFFER_LEN 1024 
#define BUFFERSIZE 1024 


int mystrcmp(char const *, char const *); 


void err_syserr(char *fmt, ...) 
{ 
    int errnum = errno; 
    va_list args; 
    va_start(args, fmt); 
    vfprintf(stderr, fmt, args); 
    va_end(args); 
    if (errnum != 0) 
     fprintf(stderr, "(%d: %s)\n", errnum, strerror(errnum)); 
    exit(EXIT_FAILURE); 
} 
int main() { 
    char line[BUFFER_LEN]; 
    char* argv[100];   
    char* path= "/bin/";  
    char progpath[20];  
    int argc;    
    size_t length; 
    char *token; 
    int i=0; 
    int pid; 
    while(1) { 
    i = 0; 
     printf("miniShell>> ");      

     if(!fgets(line, BUFFER_LEN, stdin)) { 
      break;         
     } 
     length = strlen(line); 
     if (line[length - 1] == '\n') { 
      line[length - 1] = '\0'; 
     } 
     if(strcmp(line, "exit")==0) {   
      break; 
     } 
    if(strcmp(line, "cd")==0) {   
      /*printf("change directory to %s\n", argv[2]); 
      chdir(argv[2]);*/ 
     } 

     token = strtok(line," "); 

     while(token!=NULL) { 
      argv[i]=token; 
      token = strtok(NULL," "); 
      i++; 
     } 
     argv[i]=NULL;      

     argc=i;       
     for(i=0; i<argc; i++) { 
      printf("%s\n", argv[i]);  
     } 
     strcpy(progpath, path);   
     strcat(progpath, argv[0]);    

     for(i=0; i<strlen(progpath); i++) { 
      if(progpath[i]=='\n') { 
       progpath[i]='\0'; 
      } 
     } 
     pid= fork();    

     if(pid==0) {    
      execvp(progpath,argv); 
      fprintf(stderr, "Child process could not do execvp\n"); 

     } else {     
      wait(NULL); 
      printf("Child exited\n"); 
     } 

    } 
return (0); 
} 

int mystrcmp(char const *p, char const *q) 
{ 
    int i = 0; 
    for(i = 0; q[i]; i++) 
    { 
     if(p[i] != q[i]) 
      return -1; 
    } 
    return 0; 
} 

int cd(char *pth) { 
    char path[BUFFERSIZE]; 
    char cwd[BUFFERSIZE]; 
    char * return_value; 
    int other_return; 
    strcpy(path,pth); 

    if(pth[0] != '/') 
    { 
     return_value = getcwd(cwd,sizeof(cwd)); 
     strcat(cwd,"/"); 
     strcat(cwd,path); 
     other_return = chdir(cwd); 
    } else { 
     other_return = chdir(pth); 
    } 
    printf("Spawned foreground process: %d\n", getpid()); 
    return 0; 
} 
+0

你的實際問題是什麼?你期望什麼,你有什麼,它有什麼不同? – Eregrith

回答

0

我建議用unistd庫中的getopt函數解析您的參數。它也覆蓋在this question

Heregetopt命令的文檔。