gpt4 book ai didi

诸如 "ls -l"之类的命令未在 execl 中执行,而在 execvp 中它有效

转载 作者:行者123 更新时间:2023-12-04 11:39:00 28 4
gpt4 key购买 nike

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);
}

最佳答案

使用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] 传递的值。

The reason why I adopted the execl() approach is because the path of the binaries could differ whereas execvp() did not provide me that feature.

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

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

execvp() 将在 $PATH 上搜索 ls 并执行找到的第一个匹配的程序。第二个将执行 /bin/ls 而根本不查看 $PATH

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

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

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


What confuses me is that in execvp(argv[0], argv); why are we passing the entire argv as the 2nd parameter? So suppose argv[0] was "ls -l", why do we have to pass the entire argv as the 2nd parameter?

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

exec*() 函数是用于执行进程的低级函数。第一个参数指定要运行的程序(通常是二进制文件;有时是带有 shebang 行的脚本,例如 #!/bin/sh 作为第一行)。在 execv()execvp()execve()execvpe() 的情况下,第二个argument 是参数 vector ,就像 main() 函数接收参数 vector (或参数 vector ,因此 argv)。这是程序参数的空终止列表。如果要使用选项 -l 执行 ls 命令,则需要在 argv 中指定三个(!)值 "ls", "-l" 和一个空指针:

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

使用 execl*() 函数,您可以将要运行的程序指定为第一个参数,然后是写出的参数 vector :

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

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

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

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

这些结合起来:

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

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

关于诸如 "ls -l"之类的命令未在 execl 中执行,而在 execvp 中它有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15017102/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com