我正在尝试运行一个简单的 C 程序。
#include <stdio.h>
#include <unistd.h>
extern char** environ;
int main(){
// execl("/bin/sh","sh","-c","/bin/ls -l",(char *) NULL);
char* argv[] = {"/bin/sh","sh","-c","/bin/ls", (char*) NULL};
execve(argv[0], argv, environ);
return 0;
}
注释掉的 execl 运行良好。但是当我尝试对 execve 执行相同操作时,编译器会调用以下错误:
/bin/sh: 0: Can't open sh
我在这里做错了什么?
请注意,您使用
argv[0]
(/bin/sh
) 两次,一次作为 的第一个参数execve()
,另一次作为传递给它的第二个参数的数组的一部分。这不是您的execl()
调用中发生的事情,您只有/bin/sh
第一个参数(程序文件)。所以,你
execve()
执行文件/bin/sh
,给它程序名称(第零个参数),/bin/sh
和常规参数sh
,,。这与调用几乎相同。或者在 shell 命令行中:-c
/bin/ls
execl("/bin/sh", "/bin/sh", "sh", "-c", "/bin/ls", (char*) NULL)
这告诉外壳程序尝试运行
sh
在当前目录中调用的脚本,如果脚本不存在,错误消息就是 Dash 给出的。零可能是命令行参数的行号。(Bash 给出了类似但不同的错误消息,并且似乎也在寻找脚本PATH
。我不确定标准是否说明了关于PATH
在此处使用的任何内容。)你可以改为
或者可能