【问题标题】:Trouble with parsing and evecvp解析和 evecvp 的问题
【发布时间】:2014-03-17 20:49:32
【问题描述】:

我正在尝试编写一个 C 程序,它将 Luunix 命令读取为字符串,将字符串解析为 char*[],然后使用 evecvp 执行命令。

这是我的代码:

解析字符串

        char *args[40];
        char command[80];
        fgets (command, MAX_LINE, stdin);
        int counter = 0;
        token = strtok(command," ");
        args[0] = token;



        //printf("%s\n",args[0]);

        while(should_run == 1){
            token = strtok(NULL," ");
            if (token == NULL){
                break;
            }
            counter++;
            args[counter] = token; 
            printf("%s\n",token);       
        }
        args[counter+1] = NULL;
        executeCommands(args, counter, -1);

执行命令

void executeCommands(char *args[], int counter, int histCounter){
/*int j;
for (j = 0; j <= counter; j++){
    printf("%s",args[j]);
}*/
printf("\n");
pid_t pid;
pid = fork();
if (pid == 0){
    execvp(args[0], args);
    printf("exec failed: %s\n", strerror(errno));
}
else{
    if(counter == -1 && histCounter == 1){
        wait(NULL);
    }
    else if(*args[counter] == '&'){
        wait(NULL);
    }
} 

}

当我输入诸如“ls”或“pwd”之类的简单输入时,它会输出“exec failed: No such file or directory”。唯一有效的命令是“pwd &”,它输出“忽略非选项参数”,后跟正确的当前路径。

【问题讨论】:

标签: c linux process exec


【解决方案1】:

一个问题是输入中的换行符停留在字符串的末尾,例如您将 ls\n 传递给 execvp() 而不是 ls。在致电executeCommands() 之前尝试这样的操作:

char *a = args[counter];
a[strlen(a) - 1] = '\0';
args[counter+1] = NULL;
executeCommands(args, counter, -1);

【讨论】:

  • 另一个我认为是同一个问题的快速问题。当我输入命令“cd ..”或“cd 目录”时,我得到“执行失败:没有这样的文件或目录”并且该目录肯定存在。
猜你喜欢
  • 2011-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-09
  • 2015-09-28
  • 2023-04-09
  • 1970-01-01
相关资源
最近更新 更多