C-Execvp() 总是失败

标签 c exec

我正在尝试用 c 语言创建一个 shell,当前正在尝试 ls 命令,但子进程总是返回 execvp 无法工作。这是函数。首先,我使用 exec 获取我所在的路径和从 stdin 获取的命令,这就是为什么我在复制命令并使用 strtok< 后删除换行符的原因(分隔符是“”)我将所有参数放入 execv 的数组中,并用空终止字符串“关闭它”,然后打印给出正确输出的数组元素ex(ls -l 给出 ls "newline"-l) 然后我打印路径,该路径也给出正确的输出(/home/usr_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");
    }

}

最佳答案

你说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);

关于C-Execvp() 总是失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40162541/

相关文章:

c - 像 8051 这样的 8 位微 Controller 上的指针大小是多少?

linux - 检查 fork 的 child 是否已经在 perl 中执行

c - execvp 的阻塞版本 (windows)

php - 如何暂停由 PHP 的 shell_exec() 运行的 wget 下载?

java - 带有 java Runtime.getRuntime().exec(command) 的 mysqldump 命令不生成转储

C 指针 : Assignment from incompatible pointer type

c - 为什么我在函数中看到 4 字节字符串而不是 2 字节?在 C 中

c - 按升序排序整数数组,段错误 : 11

c++ - Qt Creator 找不到标题(说 : "No such file or directory")

在 fork()-ing 之后子进程没有执行