我编写了一个测试程序,试图了解如何使用execvp(),但我一直遇到问题。我的代码的相关部分是:
...
printf("execute: 'ls -a'\n");
char *args[2];
args[0] = "/bin/ls";
args[1] = "ls";
args[2] = "-a";
...
} else if(pid == 0){ //child process
if(execvp(*args, args) < 0) { //execute command
fprintf(stderr, "Error: execution failed\n");
exit(1);
}
}
...
每当我运行时,我都会收到错误“/ bin / ls:无法访问ls:没有这样的文件或目录”。 which ls
告诉我/ bin / ls所以我不明白我做错了什么。是因为可执行文件不在我的主目录中,而是项目文件?
答案 0 :(得分:3)
这里有几个问题:
args
被定义为一个2元素数组,但你要放入3个元素,所以你要写过数组的末尾。
args
数组需要有一个NULL指针作为最后一个元素,否则execvp
将不知道它何时到达参数列表的末尾。
args
中的第一个元素应该是程序的名称(这是ps
列表中显示的内容),后续元素应该是参数。现在的方式是,你有ls
作为数组中的第二个元素,这意味着它是命令/bin/ls
的第一个参数。因此ls
命令尝试在当前目录中找到名为ls
的文件但不能。这解释了您收到的错误消息。
应用修复程序:
...
printf("execute: 'ls -a'\n");
char *args[3];
char *path = "/bin/ls";
args[0] = "ls";
args[1] = "-a";
args[2] = NULL;
...
} else if(pid == 0){ //child process
if(execvp(path, args) < 0) { //execute command
fprintf(stderr, "Error: execution failed\n");
exit(1);
}
}
答案 1 :(得分:1)
与C - error when attempting to pass /bin/ls to execvp
相同的问题您基本上必须使用NULL指针终止指针数组。
答案 2 :(得分:1)
我真的认为代码是
char *args[3];
args[0] = "/bin/ls";
args[1] = "-a";
args[2] = NULL;
比
char *args[2];
args[0] = "/bin/ls";
args[1] = "ls";
args[2] = "-a";