我遇到了一些execve的问题。 我正在尝试制作一个可以像bash shell一样运行的shell,但是我在forked child执行命令时遇到问题。 这里是我为child编写的代码:cmd是用户输入的命令的char *。 但是,当我运行此程序时,perror会报错:
execve error: No such file or directory.
我已经尝试使用简单的“ls”命令运行此程序,应该将路径设置为“/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;
}
path
是否包含你认为的内容了吗?特别是考虑到strtok()
操作方式有些令人恼火,如果不按照它的规则精确操作,很容易产生垃圾数据。 - geekosaurstrtok
执行正确,为什么不加入一个printf()
来显示path
的最终内容呢?execve
调用本身看起来很好。 - Ernest Friedman-Hillexecv()
来使用当前环境,或者将environ
作为第三个参数传递给execve()
。我怀疑这不是你问题的根源,但这是更好的实践。(此外,通常明智的做法是使用execv(newargv[0], newargv);
或execve(newargv[0], newargv, environ);
。而且没有必要测试任何exec*()
函数的返回状态:如果它返回了,那么它失败了;如果它成功了,它就不会返回。) - Jonathan Leffler