我在execve上遇到一些问题。 我正在试图创build一个可以像bash shell一样运行的shell,但是我执行一个命令的时候遇到了问题。 这是我给孩子的。 cmd是一个char *,用户input的命令。但是,当我运行这个程序时,我从perror得到这个错误:
execve error: No such file or directory.
我用一个简单的ls来试试这个程序,它应该让path =“/ bin / ls”并执行它(我已经证实这是我的ls命令所在),但是它仍然抱怨。 我究竟做错了什么? 谢谢!
码:
if(pid == 0){ // Parse the command char * word = strtok(cmd, " "); char path[128] = "/bin/"; strcat(path, word); // Execute the process char * newenvp[] = { NULL }; char * newargv[] = { path, NULL }; ret = execve(path, newargv, newenvp); if(ret == -1){ perror("execve error"); } return EXIT_SUCCESS; }
我会做的第一件事就是插入:
printf ("[%s]\n", path);
在调用execve
之前。 这应该确认可执行文件是你认为的。
只要您输入的输入正确且可执行文件实际可用,那么您的代码看起来就没问题。 例如,以下完整的程序在我的Debian框中工作正常:
#include <stdio.h> #include <string.h> #include <unistd.h> int main (int argc, char *argv[]) { if (argc > 1) { char * word = strtok (argv[1], " "); char path[128] = "/bin/"; strcat (path, word); char * newenvp[] = { NULL }; char * newargv[] = { path, NULL }; printf ("[%s]\n", path); int ret = execve (path, newargv, newenvp); if (ret == -1) { perror("execve error"); } } return 0; }
输出,当我运行./testprog ls
,沿线的东西:
[/bin/ls] kidsshares.ods paxwords birthdays homeloantracking.gnumeric shares2011.ods backup0.sh development lexar accounts.ods backup1.sh photos testprog.c testprog
如果您不想手动通过文件系统来查找正确的二进制文件,则有execlp
(带有一个额外的p )。 从手册:
如果指定的文件名不包含斜杠(/)字符,则execlp (), execvp ()和execvpe ()函数将重复执行shell搜索可执行文件的操作。 该文件是在PATH环境变量中指定的以冒号分隔的目录路径名列表中查找的。 如果未定义此变量,则路径列表默认为当前目录,后跟confstr(_CS_PATH)返回的目录列表。 (这个confstr(3)调用通常返回值“/ bin:/ usr / bin”。)[…]