过去 2 天我一直在尝试理解 execlp()
系统调用,但我在这里。让我直奔主题。
execlp的man page
将系统调用声明为int execlp(const char *file, const char *arg, ...);
,描述如下:< em> execl()、execlp() 和 execle() 函数中的 const char arg 和后续省略号可以认为是 arg0、arg1、...、argn。
然而我在教科书中看到系统调用是这样调用的:execlp(“/bin/sh”, ..., “ls -l/bin/??”, ...);
(“...”供我们学生理解)。然而,这个系统调用甚至不像系统调用的man page
上的声明。
我很困惑。任何帮助表示赞赏。
最佳答案
这个原型(prototype):
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/??
关于c - 我不明白 execlp() 在 Linux 中的工作原理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21558937/