为什么chdir()不成功?

时间:2013-05-30 16:27:42

标签: c string chdir

我正在编写一个基本shell,我的第一个要求是测试cd,我有可能的cd命令的所有条件,之后,我将处理像ls这样的命令。至于现在,我对一段代码感到困惑。

 #include <stdio.h>
 #include <string.h>
 #include <unistd.h>
 #include <stdlib.h>

 #define MAX_TOK 50
 #define MAX_LEN 100
 #define BUFSIZE 81

 int tokenize(char *cmd, char tokens[MAX_TOK][MAX_LEN]){
     char *token;
     int NUM_TOKENS = 0;
     //printf("Splitting the string \"%s\" into tokens:\n",cmd);
     token = strtok(cmd, " ");

    while(token != NULL){
         strcpy(tokens[NUM_TOKENS],token);
         token = strtok(NULL, " ");
         NUM_TOKENS++;
     }
      return NUM_TOKENS;
  }

void decide(char tokens[MAX_TOK][MAX_LEN], int NUM_TOKENS){

    char *home = getenv("HOME");
    int success;
    char *cd = {"cd"};
    char *string = tokens[1];
    //printf("Number of tokens %d\n", NUM_TOKENS);
    //printf("%d\n",strcmp(tokens[0], cd));

    if(strcmp(tokens[0], cd) == 0){
        if(NUM_TOKENS > 2){
            printf("error: Too many arguments\n");
        }
        else{
           printf("Changing to new directory %s \n",tokens[1]);
           char *string = tokens[0];
           //printf("%s\n", tokens[1]);
           success = chdir(tokens[1]);
           printf("%d\n",success);
        }
    }
    else{
        printf("Completing the %s request\n",tokens[0]);
        take_action(tokens[0]);
    } 
 }

void take_action(char *cmd){
     printf("%s\n",cmd);
     int len;
     int return_code;
     char buffer[BUFSIZE];
     int pid;
     pid = fork();
     if(pid != 0){
         //parent process executing
         wait(NULL);
     }else{
         //child process executing
         len = strlen(buffer);
         if(buffer[len-1] == '\n'){
         buffer[len-1] = '\0';
       }
    return_code = execlp(cmd, cmd, NULL);
    if(return_code != 0){
        printf("Error executing %s.\n", cmd);
    }
   }//end else
}

int main(){
char *cmd;
char tokens[MAX_TOK][MAX_LEN];
int len;
int return_code;
char buffer[BUFSIZE];
int pid;

while(cmd != NULL){
    printf("Enter a command\n");
    cmd = fgets(buffer, BUFSIZE, stdin);
    // find the command
    int NUM_TOKENS = tokenize(cmd, tokens);
    //print_tokens(NUM_TOKENS, tokens);
    decide(tokens,NUM_TOKENS);
}



}//end main

当硬编码chdir("test")代码运行正常时,如果命令行中的用户输入"cd test" tokens[0]cdtokens[1]为字符串{{ 1}}但是"test"失败了,我不明白为什么。

打印令牌[1]也将“test”显示为存储的字符串。当将参数传递给take_action时,我被告知会发生冲突类型。在两个print语句中都显示了正确的字符串。据我所知,没有额外的空格,因为我的令牌化功能将它们全部剥离。我很困惑,这两个部分看起来很简单但不会工作。

3 个答案:

答案 0 :(得分:3)

代码

char *string = tokens[0];
printf("%s\n", tokens[1]);
success = chdir(string);

将转换为

success = chdir("cd");

我想你想要

char *string = tokens[1];
//                    ^

代替。

答案 1 :(得分:3)

用户未输入cd test。他输入cd test然后按Enter键。

这意味着您将拥有:

token[0] = "cd";
token[1] = "test\n";

并且您没有名为"test\n"的目录,它将是"test"。您需要在最后一个标记中删除换行符。

e.g。改变主要做

char *tmp;
cmd = fgets(buffer, BUFSIZE, stdin);
if (cmd && (tmp = strrchr(buffer, '\n')) != NULL) {
   *tmp = 0;
}

答案 2 :(得分:1)

token[0]cdtoken[1]path。所以请使用char* string=token[1]