c - 我不明白 execlp() 在 Linux 中的工作原理

标签 c linux exec

过去 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/

相关文章:

c - openssl EVP_CipherFinal_ex 失败

c++ - OpenSSL C API : How to resume TLS connection after program exec()?

c - for中变量声明的顺序

python - 为独立 HTML 桌面应用程序安装 Webkit

c# - 下载多个文件 sharpSSH

c - 用户输入的字符串在 c 中运行特定函数

linux - root 用户的 Chef 客户端权限被拒绝

c - 在 C 中使用 exec 命令执行带有输出重定向的命令

php - 通过 PHP(树莓派)运行 C 程序

php - 替代 PHP exec() 函数