这个原型:
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,并给它一个要执行的命令。该命令是"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/ 目录下有两个字符的文件。如果你只是简单地执行了
execlp("ls","ls", "-l", "/bin/??", (char *)NULL);
如果没有一个名为/bin/??
的文件,那么也许什么都不会发生,因为没有一种shell可以解释和扩展/bin/??。