我已经花了最后两天的时间来理解execlp()系统调用,但是我仍然在这里。让我直接谈谈这个问题。
execlp()
在man pageexeclp的声明系统调用为int execlp(const char *file, const char *arg, ...);与描述: 该为const char ARG和随后的椭圆在execl的(),execlp()和execle()函数可以作为为arg0,ARG1,…,ARGN被认为。
man page
int execlp(const char *file, const char *arg, ...);
但是,我在课本中看到这样的系统调用:(execlp(“/bin/sh”, ..., “ls -l /bin/??”, ...);“ …”是我们作为学生来识别的)。但是,此系统调用甚至与系统调用上的声明都不相似man page。
execlp(“/bin/sh”, ..., “ls -l /bin/??”, ...);
我很困惑。任何帮助表示赞赏。
这个原型:
说execlp是一个变量参数函数。这需要2 const char *。其余的参数(如果有的话)是要移交给我们要运行的程序的其他参数-而且char *-所有这些都是C字符串(最后一个参数必须是NULL指针)
const char *
char *
因此,该file参数是要执行的可执行文件的路径名。arg是我们希望argv[0]在可执行文件中显示的字符串。按照惯例,argv[0]只是可执行文件的文件名,通常将其设置为与相同file。
file
arg
argv[0]
在...现在的其他参数给予可执行文件。
...
假设您是从命令行/ shell运行的:
$ ls
那将是execlp("ls", "ls", (char *)NULL); 或者如果您跑步
execlp("ls", "ls", (char *)NULL);
$ ls -l /
那会是 execlp("ls", "ls", "-l", "/", (char *)NULL);
execlp("ls", "ls", "-l", "/", (char *)NULL);
如此下去 execlp("/bin/sh", ..., "ls -l /bin/??", ...);
execlp("/bin/sh", ..., "ls -l /bin/??", ...);
在这里,您将转到外壳程序/ bin / sh,并向外壳程序执行命令。该命令是“ ls -l / bin / ??”。您可以从命令行/ shell手动运行该命令:
$ ls -l /bin/??
现在,如何运行shell并告诉它执行命令?您打开外壳的文档/手册页并阅读。
您要运行的是:
$ /bin/sh -c "ls -l /bin/??"
这变成
execlp("/bin/sh","/bin/sh", "-c", "ls -l /bin/??", (char *)NULL);
旁注:/bin/??正在进行模式匹配,该模式匹配由外壳程序完成,并且扩展到/ bin /下的所有文件(具有2个字符)。如果你只是做了
/bin/??
execlp("ls","ls", "-l", "/bin/??", (char *)NULL);
可能什么也不会发生(除非实际上有一个文件名为/bin/??),因为没有解释和扩展/ bin / ??的shell。