我尝试使用execve运行命令:ls -l /tmp
,我熟悉系统调用的用法,但我不知道它是如何运行命令的。
我已经试过了,我一直得到错误
char *argv[] = {"ls", "-l", NULL};
int exec;
exec = execve("/tmp", argv, NULL);
printf("%dn", exec);
return (0);
您没有正确使用execve
。第一个参数必须是可执行路径。
int main(void) {
char *argv[] = {"ls", "-l", "/tmp", NULL};
execve("/bin/ls", argv, NULL);
// Or "/usr/bin/ls", depending where
// is stored 'ls' on your system
// On success theses lines are not reached
perror("execve failed");
return 0;
}
注意(来自man execve):
RETURN VALUE
如果成功,execve()不返回,如果错误返回-1;errno被设置为表示错误。
如果execve
调用成功,您的程序将被启动的程序(这里是ls
)所替换,因此最后两行将不会执行
execve
的第一个参数是要执行的程序的路径[1]
char *argv[] = { "ls", "-l", "/tmp", NULL };
execve( "/usr/bin/ls", argv, NULL );
注意,我们必须提供二进制文件的完整路径。为了在需要时搜索PATH来避免这种情况,我们可以使用" "变体。
char *argv[] = { "ls", "-l", "/tmp", NULL };
execvpe( argv[0], argv, NULL ); # execvpe is a GNU extension.
为envp
参数传递NULL
是不标准的。在Linux上,它会导致新程序拥有一个空的环境,这在这里是非常不可能的。相反,使用
char *argv[] = { "ls", "-l", "/tmp", NULL };
execvp( argv[0], argv );
最后,exec*
的目的是改变当前进程执行的程序。因此,它只在出现错误时返回,并且总是在出现错误时返回-1
。打印出来是没有用的。要打印错误信息,可以使用perror
。
- 要设置作为当前工作目录的路径,必须在
exec*
之前使用chdir
。
execve
的第一个参数必须是要执行的程序的路径:
exec = execve("/bin/ls", argv, NULL);
第二个参数argv
必须是所有参数的列表:
char *argv[] = {"ls", "-l", "/tmp", NULL};