使用 execvp 时没有这样的文件或目录错误
No such file or directory error using execvp
我编写这个程序是为了使用 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 ...
谁能帮帮我
您正在设置 cmd[argc] = NULL;
,但 1 太多了(argc
是包含您的命令的参数计数)。所以 cmd[argc - 1]
没有初始化(注意上面的循环停止在 argc - 2
您需要将 cmd[argc - 1]
设置为 NULL
,否则会将另一个垃圾参数传递给 execvp
,这说明 mkdir
适用于第一个参数,但在处理垃圾参数时失败。由于这种转变,所有命令都会收到垃圾参数。
您需要一个大小为 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
我编写这个程序是为了使用 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 ...
谁能帮帮我
您正在设置 cmd[argc] = NULL;
,但 1 太多了(argc
是包含您的命令的参数计数)。所以 cmd[argc - 1]
没有初始化(注意上面的循环停止在 argc - 2
您需要将 cmd[argc - 1]
设置为 NULL
,否则会将另一个垃圾参数传递给 execvp
,这说明 mkdir
适用于第一个参数,但在处理垃圾参数时失败。由于这种转变,所有命令都会收到垃圾参数。
您需要一个大小为 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