2

execl在变体中使用下面的代码ls有效,但ls -l无效,但在我的execvp方法lsls-l有效。我采用这种execl方法的原因是因为二进制文件的路径可能不同,而execvp没有为我提供该功能。理想情况下,我execl也想继续工作ls -l,但现在它不工作ls -l。我尝试阅读手册页,但没有帮助。

void child(int argc, char *argv[MAX_ARGS])
{
        execvp(argv[0], argv);
}


void child(char *argv[], char* path)
{
        execl(path, argv, NULL);
}
4

1 回答 1

14

使用execl(),您必须一一列出参数;仅当您提前确切知道要执行的操作时,它才有用:

execl("/bin/ls", "ls", "-l", (char *)0);
execl("/bin/sh", "sh", "-c", "ls -l", (char *)0);
execl("/bin/ls", "pink elephants", "-l", (char *)0);

等等。

如果您不知道要处理多少争论,请使用execvp()或使用其他家庭成员之一execv*()。另请注意,您必须指定命令的路径;execvp()向下搜索$PATH,但execl()没有。另请注意,您可以选择作为传递的值argv[0]

我采用这种execl()方法的原因是因为二进制文件的路径可能不同,而execvp()没有为我提供该功能。

我不确定你在这里的意思。使用execvp(),您可以指定:

char *argv[] = { "ls", "-l", 0 };
execvp(argv[0], argv);
execv("/bin/ls", argv);

execvp()搜索ls$PATH执行找到匹配的第一个程序。第二个将在/bin/ls不查看的情况下执行$PATH

char *argv[] = { "/bin/ls", "-l", 0 };

execv(argv[0], argv);
execvp(argv[0], argv);

这些中的任何一个都可以工作;第二个不会使用基于 PATH 的搜索,因为可执行文件名称 ( argv[0]) 包含斜杠。


令我困惑的是,execvp(argv[0], argv);为什么我们将整个argv作为第二个参数传递?所以假设argv[0]"ls -l",为什么我们必须将整个argv作为第二个参数传递?

假设argv[0]contains "ls -l",你有一个问题。大多数系统没有文件“ /bin/ls -l”或“ /usr/bin/ls -l”(其中空白是名称的一部分),但这就是您要执行的内容。

这些exec*()函数是用于执行进程的低级函数。第一个参数指定要运行的程序(通常是二进制文件;有时是带有 shebang 行的脚本,例如#!/bin/sh第一行)。在execv()orexecvp()execve()or的情况下execvpe(),第二个参数是参数向量,就像main()函数接收参数向量(或参数向量,因此argv)一样。这是程序参数的以 null 结尾的列表。如果要ls使用 option 执行命令-l,则需要在argv三个(!)值中指定"ls""-l"以及一个空指针:

char argv[] = { "ls", "-l", 0 };

使用这些execl*()函数,您指定要运行的程序作为第一个参数,然后是写出的参数向量:

execl("/bin/ls", "ls", "-l", (char *)0);

如果你有 10 个参数,你必须写出 10 个参数(加上空指针)。

exec*()函数中,名称包含:

  • l— 列出格式参数
  • v— 矢量格式参数
  • p— 对程序进行 PATH 查找(如果给定的名称不包含斜杠)
  • e— 也采用环境变量向量

这些结合起来给出:

  • execl()
  • execv()
  • execlp()
  • execle()
  • execvp()
  • execve()

有时没有execlpe()and有点令人讨厌execvpe()(但请参阅 Linux 扩展execvpe(3))。页面从概要中省略其中一些内容,但在手册页的正文中提及它们也是man 2 exec传统的——这种传统/遗产至少可以追溯到 1979 年的第 7 版 UNIX™(并且至少持续到 RHEL 5 Linux和 Mac OS X 10.7.5;man 2 execl页面提到execve()但未在概要部分列出)。其他exec*()函数都可以构建在上面execve()——这是集合中的基本函数(因此execve(2)在 Linux 手册中列出)。

于 2013-02-22T04:56:09.827 回答