我不明白execlp()在Linux中是如何工作的

Arm*_*bal 30 c linux exec

我花了最近两天试图理解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)