我尝试使用execve运行命令:ls -l /tmp,我熟悉系统调用的用法,但不知道它如何运行命令。我已经尝试过了,但总是出错
ls -l /tmp
char *argv[] = {"ls", "-l", NULL}; int exec; exec = execve("/tmp", argv, NULL); printf("%d\n", exec); return (0);
cvxl0en21#
你没有正确使用execve。第一个参数必须是可执行路径。所以你的代码应该是
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):返回值成功时,execve()不返回,错误时返回-1,并设置errno以指示错误。如果execve调用成功,您的程序将被已启动的程序(此处为ls)替换,因此最后两行将不会执行
ls
qoefvg9y2#
execve的第一个参数是要执行的程序的路径。
char *argv[] = { "ls", "-l", "/tmp", NULL }; execve( "/usr/bin/ls", argv, NULL );
请注意,我们必须提供二进制文件的完整路径。为了在需要时通过搜索PATH来避免这种情况,我们可以使用“p”变量之一来代替。
char *argv[] = { "ls", "-l", "/tmp", NULL }; execvpe( argv[0], argv, NULL ); # execvpe is a GNU extension.
为envp参数传递NULL不是标准的。在Linux上,这会导致新程序具有空环境,这不太可能是这里所需要的。
envp
NULL
char *argv[] = { "ls", "-l", "/tmp", NULL }; execvp( argv[0], argv );
最后,exec*的作用是改变当前进程执行的程序。因此,它只在出错时返回,并且总是在出错时返回-1。打印这个没有用。要打印错误消息,可以使用perror。1.要设置用作当前工作目录的路径,请在exec*之前使用chdir。
exec*
-1
perror
chdir
qlfbtfca3#
execve的第一个参数必须是要执行的程序的路径:
exec = execve("/bin/ls", argv, NULL);
第二个参数argv必须是所有参数的列表:
argv
char *argv[] = {"ls", "-l", "/tmp", NULL};
3条答案
按热度按时间cvxl0en21#
你没有正确使用
execve
。第一个参数必须是可执行路径。所以你的代码应该是
请注意(来自man execve):
返回值
成功时,execve()不返回,错误时返回-1,并设置errno以指示错误。
如果
execve
调用成功,您的程序将被已启动的程序(此处为ls
)替换,因此最后两行将不会执行qoefvg9y2#
execve
的第一个参数是要执行的程序的路径。请注意,我们必须提供二进制文件的完整路径。为了在需要时通过搜索PATH来避免这种情况,我们可以使用“p”变量之一来代替。
为
envp
参数传递NULL
不是标准的。在Linux上,这会导致新程序具有空环境,这不太可能是这里所需要的。最后,
exec*
的作用是改变当前进程执行的程序。因此,它只在出错时返回,并且总是在出错时返回-1
。打印这个没有用。要打印错误消息,可以使用perror
。1.要设置用作当前工作目录的路径,请在
exec*
之前使用chdir
。qlfbtfca3#
execve
的第一个参数必须是要执行的程序的路径:第二个参数
argv
必须是所有参数的列表: