C-Execvp()总是失败

C-Execvp()总是失败,c,exec,C,Exec,我正在尝试用c编写一个shell,目前正在尝试ls命令,但子进程总是返回execvp无法工作的消息。这里是函数。首先,我使用exec获取我所在的路径和从stdin获得的命令,这就是为什么我删除换行符,然后复制命令,并使用strtok(分隔符为“”)将execv的所有参数放入一个数组中,然后“关闭它”使用空终止字符串之后,我打印数组中给出正确输出的元素ex(ls-l给出ls“newline”-l),然后打印也给出正确输出的路径(/home/usr\u name/Desktop)。但是execv不起

我正在尝试用c编写一个shell,目前正在尝试ls命令,但子进程总是返回
execvp
无法工作的消息。这里是函数。首先,我使用exec获取我所在的路径和从
stdin
获得的命令,这就是为什么我删除换行符,然后复制命令,并使用
strtok
(分隔符为“”)将
execv
的所有参数放入一个数组中,然后“关闭它”使用空终止字符串之后,我打印数组中给出正确输出的元素ex(ls-l给出ls“newline”-l),然后打印也给出正确输出的路径(/home/usr\u name/Desktop)。但是
execv
不起作用,它返回
fprintf

void ls(char* path,char* cmd){
    int pid,elements,l,i=0;;
    l=strlen(cmd);
    if(cmd[l-1]=='\n'){
        cmd[l-1]='\0';
    }
    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]='\0';
    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");
    }

}
void ls(char*path,char*cmd){
int-pid,元素,l,i=0;;
l=strlen(cmd);
如果(cmd[l-1]='\n'){
cmd[l-1]='\0';
}
char*ccmd=strdup(cmd);
char*t_cmd;
字符*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]='\0';
元素=i;

对于(i=0;i你说
路径
等于
“/home/usr\u name/Desktop”
(当然是你的真实用户名)

那么这就是问题所在。如果你想知道,它会告诉你,第一个参数是你应该执行的命令

因此,要使用
execvp
执行
ls-l
,您应该执行以下操作:

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

如果系统调用失败,它将始终被设置。请检查问题所在。您可以使用从错误中获取可打印字符串。@某个程序员说权限被拒绝,因为您还混淆了术语空指针和空字符。第一个是空指针,由C中的
null
宏表示。一个空字符,即tC中字符串的终止符是字符literal
'\0'
。传递给
execv
函数的参数数组应该由null*指针终止,即
null
@Someprogrammerdude changed
w_cmd[i]=NULL;
来自“/0”,但它仍然不起作用,我不认为这就是我被拒绝权限的原因,但谢谢你,我将第一个参数更改为“ls”,并且它在不更改w_cmd的情况下工作though@noname95由于该命令通常应与第一个参数相同(
w\u cmd[0]
),因此我更新了我的答案以使用它。