2015-02-08 90 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