C-Execvp() 总是失败

C-Execvp() always fails

我正在尝试在 c 中创建一个 shell,目前正在尝试 ls 命令,但是 child 总是 returns 而 execvp 无法工作。这是 function.first 我得到我所在的路径和我使用 exec 从 stdin 获得的命令这就是为什么我在复制命令并使用 strtok(分隔符是“”)我将所有参数放在execv和"close it"的数组中,并带有一个空终止字符串,然后我打印给出正确输出的数组元素ex(ls -l give ls "newline" -l) 然后我打印也给出正确输出的路径 (/home/usr_name/Desktop)。但是 execv 从不工作,它 returns fprintf

void ls(char* path,char* cmd){
    int pid,elements,l,i=0;;
    l=strlen(cmd);
    if(cmd[l-1]=='\n'){
        cmd[l-1]='[=11=]';
    }
    char* ccmd=strdup(cmd);         
    char* t_cmd;
    char* w_cmd[1024];
    t_cmd=strtok(ccmd,DELIM);
    while(t_cmd!=NULL){
        w_cmd[i]=t_cmd;
        t_cmd=strtok(NULL,DELIM);
        i++;
    }
    w_cmd[i]='[=11=]';
    elements=i;
    for(i=0;i<elements;i++){
        printf("%s\n",w_cmd[i] );
    }
    printf("%s\n",path);
    pid=fork();
    if(pid==0){
        execvp(path,w_cmd);
        fprintf(stderr, "Child process could not do execvp\n");
    }
    else{
        wait(NULL);
        printf("Child exited\n");
    }

}

你说 path 等于 "/home/usr_name/Desktop"(当然是你的真实用户名)?

那就是问题所在。如果你read an exec manual page它会告诉你第一个参数是你应该执行的命令

所以要用 execvp 执行 ls -l 你应该做例如

char *w_cmd[] = { "ls", "-l", NULL };
execvp(w_cmd[0], w_cmd);