我花了最近两天试图理解execlp()系统调用,但是我在这里.让我直截了当地谈谈这个问题.
在man pageexeclp的声明系统调用为int execlp(const char *file, const char *arg, ...);与描述:该为const char ARG和随后的椭圆在execl的(),execlp()和execle()函数可以被认为是为arg0,ARG1,...,ARGN.
然而,在我们的教科书中,我看到系统调用就像这样被调用:( execlp(“/bin/sh”, ..., “ls -l /bin/??”, ...);"......"是我们想象的学生).然而,这个系统调用甚至不像系统调用的声明man page.
我非常困惑.任何帮助表示赞赏.
nos*_*nos 69
这个原型:
int execlp(const char *file, const char *arg, ...);
Run Code Online (Sandbox Code Playgroud)
说execlp是一个变量参数函数.它需要2 const char *.其余的参数,如果有的话,是移交给我们想要运行的程序的附加参数 - 也是char *- 所有这些都是C字符串(并且最后一个参数必须是NULL指针)
因此,file参数是要执行的可执行文件的路径名.arg是我们希望argv[0]在可执行文件中显示的字符串.按照惯例,argv[0]只是可执行文件的文件名,通常它设置为相同file.
在...现在的其他参数给予可执行文件.
假设你从命令行/ shell运行它:
$ ls
Run Code Online (Sandbox Code Playgroud)
execlp("ls", "ls", (char *)NULL);
如果你跑,那就是或者
$ ls -l /
Run Code Online (Sandbox Code Playgroud)
那就是 execlp("ls", "ls", "-l", "/", (char *)NULL);
等等 execlp("/bin/sh", ..., "ls -l /bin/??", ...);
在这里,您将转到shell,/ bin/sh,并且您将为shell提供执行命令.该命令是"ls -l/bin/??".您可以从命令行/ shell手动运行它:
$ ls -l /bin/??
Run Code Online (Sandbox Code Playgroud)
现在,如何运行shell并告诉它执行命令?您打开shell的文档/手册页并阅读它.
你想要运行的是:
$ /bin/sh -c "ls -l /bin/??"
Run Code Online (Sandbox Code Playgroud)
这变成了
execlp("/bin/sh","/bin/sh", "-c", "ls -l /bin/??", (char *)NULL);
Run Code Online (Sandbox Code Playgroud)
附注:/bin/??正在进行模式匹配,这种模式匹配由shell完成,并扩展到/ bin /下有2个字符的所有文件.如果你只是这样做
execlp("ls","ls", "-l", "/bin/??", (char *)NULL);
Run Code Online (Sandbox Code Playgroud)
可能没有任何事情发生(除非有一个实际命名的文件/bin/??),因为没有shell解释和扩展/ bin/??
lih*_*udi 13
execl的限制是当执行shell命令或任何其他不在当前工作目录中的脚本时,我们必须传递命令或脚本的完整路径.例:
execl("/bin/ls", "ls", "-la", NULL);
Run Code Online (Sandbox Code Playgroud)
传递可执行文件的完整路径的解决方法是使用函数execlp,它在PATH指向的那些目录中搜索文件(execlp的第一个参数):
execlp("ls", "ls", "-la", NULL);
Run Code Online (Sandbox Code Playgroud)