使用execvp没有此类文件或目录错误

时间:2017-09-09 21:38:41

标签: c 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错误,但实际上{{1}}命令创建了目录newdir ... 有人可以帮助我

1 个答案:

答案 0 :(得分:1)

您正在设置cmd[argc] = NULL;但是过多了1(argc是包含您的命令的args计数)。因此cmd[argc - 1]尚未初始化(请注意,上面的循环停在argc - 2

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

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

此外,正如评论中所述,您首先使用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