2015-02-08 96 views
0

我想在c中編寫一個簡單的shell,我開始通過從網上抓取一些代碼來進行簡單解析,但是我遇到了一個問題,當我嘗試用args執行命令時,例如ls -l它會忽略這個參數,system()沒有考慮這些參數嗎?代碼如下系統調用的參數

#include <stdio.h> 
#include <stdlib.h> 
#include <unistd.h> 
#define DELIMS " \t\r\n" 
#include <errno.h> 
#include <string.h> 

int main(int argc, char *argv[]) { 
    char *cmd; 
    char line[1024]; 
    printf("Starting Omar's Shell\n"); 
    while (1) { 
    printf("What can i do for you?>"); 

    if (!fgets(line, 1024, stdin)) break; 
    // Parse and execute command 
    if (cmd = strtok(line, DELIMS)) { 
     // Clear errors 
     errno = 0; 

     if (strcmp(cmd, "exit") == 0) { 
     break; 

     } else { 
      if(system(line) !=0){ 
      printf("An error has occured\n"); 
      } 
     } 

     if (errno) perror("Command failed"); 
    } 
    } 

    return 0; 
} 
+2

'strtok'破壞原始行。這就是它的工作原理,它會插入''\ 0'',以便您可以遍歷令牌。要麼使用不同的方法,要麼在使用strtok之前複製字符串。 – keltar 2015-02-08 05:59:32

+0

我試過@CoolGuy,但它似乎沒有工作,所以相反,我在我調用strtok()之前複製了字符串,而是用副本執行了命令。有沒有其他方法可以解決這個問題? – Stiddi 2015-02-08 06:16:45

+0

總有其他的方法。你可以實現非破壞性的strtok替代方法,它會將單詞複製到單獨的緩衝區而不是破壞原始文件。或者,如果您的shell旨在或多或少地進步,那麼實施詞法分析器並處理其中的令牌提取可能是一個好主意。 – keltar 2015-02-08 06:25:24

回答

0

strtok破壞原始行。這就是它的工作方式,它會插入'\0',以便您可以遍歷令牌。在使用strtok之前,請使用不同的方法或複製字符串。 - keltar