【问题标题】:No such file or directory error using execvp使用 execvp 没有这样的文件或目录错误
【发布时间】:2017-09-09 21:38:40
【问题描述】:

我编写这个程序是为了使用execvp 命令,这是我的代码:

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

int main(int argc, const char * argv[]) {

    char **cmd;
    int i;

    if (argc == 1){

        fprintf(stdout, "No command inserted!\n");
        exit(EXIT_SUCCESS);

    }

    cmd = (char **) malloc( (argc + 1) * sizeof(char *));
    cmd[0] = (char *) malloc( strlen(argv[1] + 1 ) * sizeof(char) );
    strcpy(cmd[i], argv[i+1]);

    if (argc > 2){

        for (i = 1 ; i < argc - 1  ; i++ ){

            cmd[i] = (char *) malloc( strlen(argv[i+1] + 1 ) * sizeof(char) );
            strcpy(cmd[i], argv[i+1]);

        }

        cmd[argc] = NULL;
        execvp(cmd[0], cmd);

        fprintf(stderr, "Failed Execution or not existing command!!\n");
        exit(EXIT_FAILURE);

    }

    cmd[1] = NULL;

    execvp(cmd[0], cmd);

    fprintf(stderr, "Failed Execution or not existing command!!\n");
    exit(EXIT_FAILURE);

    return 0;
}

我使用这些命令在终端上运行这个程序 ./a.out ls ./a.out who ./a.out ls -l ./a.out mkdir newdir

前两个和其他没有参数的命令一样工作正常。最后两个我在终端中收到No such File or Directory 错误,但实际上mkdir 命令创建了目录newdir ... 谁能帮帮我

【问题讨论】:

  • 你在调用strcpy时使用了未初始化的i

标签: c execvp


【解决方案1】:

您正在设置 cmd[argc] = NULL; ,但 1 太多了(argc 是包含您的命令的 args 计数)。所以cmd[argc - 1] 没有被初始化(注意上面的循环停在argc - 2

您需要将cmd[argc - 1] 设置为NULL,否则将另一个垃圾参数传递给execvp,这说明mkdir 适用于第一个参数,但在处理垃圾参数时失败。由于这种转变,所有命令都会收到垃圾参数。

您需要一个大小为argc 的指针数组,而不是argc + 1,因为不考虑a.out 命令。

此外,如 cmets 中所述,您使用的 i 最初未初始化,这有效(因为您的 mkdir 命令有效)但运气不好(未定义的行为)

一个更简单的方法是复制argv指针数组(忽略第一个是您的注释)而不复制字符串内容的内存(因为您没有修改它们)。

   cmd = malloc( argc * sizeof(char *)); // argc because we need 1 slot for NULL termination
   for (i=0;i<argc-1;i++)
   {
     cmd[i] = argv[i+1];
   }
   cmd[i] = NULL;  // i is argc-1 now

【讨论】:

    猜你喜欢
    • 2016-02-16
    • 2017-02-10
    • 2013-03-31
    • 1970-01-01
    • 2021-03-10
    • 2021-10-31
    • 1970-01-01
    • 2019-03-31
    相关资源
    最近更新 更多