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

我花了最后2天试图了解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上的声明那样。

我超级困惑。 任何帮助表示赞赏。

提前致谢。

Solutions Collecting From Web of "我不明白execlp()如何在Linux中工作"

这个原型:

  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/?? ),因为没有解释和展开/ bin / ??的shell。

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

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

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

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