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

时间:2014-02-04 17:10:20

标签: c linux exec

我花了最近两天的时间尝试了解execlp()系统调用,但是我在这里。让我直接谈谈这个问题。

execlp的man page将系统调用声明为int execlp(const char *file, const char *arg, ...);,其描述为: execl(),execlp()和execle()函数中的const char arg和后续省略号可以被认为是arg0,arg1,...,argn。

然而,我在教科书中看到系统调用是这样调用的:execlp(“/bin/sh”, ..., “ls -l /bin/??”, ...);(“......”是我们想象的学生)。但是,这个系统调用甚至不像系统调用的man page上的声明。

我非常困惑。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分:64)

这个原型:

  int execlp(const char *file, const char *arg, ...);

说execlp是一个变量参数函数。需要2 const char *。其余的参数,如果有的话,是移交给我们想要运行的程序的附加参数 - 也是char * - 所有这些都是C字符串(并且最后一个参数必须是NULL指针)

因此,file参数是要执行的可执行文件的路径名。 arg是我们希望在可执行文件中显示为argv[0]的字符串。按照惯例,argv[0]只是可执行文件的文件名,通常设置为与file相同。

...现在是赋予可执行文件的附加参数。

假设你从命令行/ shell运行它:

$ ls

那是execlp("ls", "ls", (char *)NULL); 或者如果你运行

$ ls -l /

那是execlp("ls", "ls", "-l", "/", (char *)NULL);

所以到execlp("/bin/sh", ..., "ls -l /bin/??", ...);

这里你要转到shell,/ bin / sh,然后你给shell执行一个命令。该命令是“ls -l / bin / ??”。您可以从命令行/ shell手动运行它:

 $ ls -l /bin/??

现在,如何运行shell并告诉它执行命令?打开shell的文档/手册页并阅读它。

您想要运行的是:

$ /bin/sh -c "ls -l /bin/??"

这变为

  execlp("/bin/sh","/bin/sh", "-c", "ls -l /bin/??", (char *)NULL);

旁注: /bin/??正在进行模式匹配,这种模式匹配由shell完成,并扩展到/ bin /下有2个字符的所有文件。如果你只是做了

  execlp("ls","ls", "-l", "/bin/??", (char *)NULL);

可能没有任何事情会发生(除非文件实际上名为/bin/??),因为没有shell解释和扩展/ bin / ??

答案 1 :(得分:13)

execl的限制是当执行shell命令或任何其他不在当前工作目录中的脚本时,我们必须传递命令或脚本的完整路径。 示例:

execl("/bin/ls", "ls", "-la", NULL);

传递可执行文件的完整路径的解决方法是使用函数 execlp ,它在指向的那些目录中搜索文件(execlp的第一个参数)。路径:

execlp("ls", "ls", "-la", NULL);