在execl
变体中使用以下代码,ls
可以工作,但ls -l
不能工作,但在我的execvp
方法中,ls
和ls-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);
}
发布于 2013-02-22 04:56:10
使用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()
将在$PATH
上搜索ls
并执行找到的第一个匹配的程序。第二个将在根本不查看$PATH
的情况下执行/bin/ls
。
char *argv[] = { "/bin/ls", "-l", 0 };
execv(argv[0], argv);
execvp(argv[0], argv);
这两种方法都可以使用;第二种方法不使用基于路径的搜索,因为可执行文件名(argv[0]
)包含斜杠。
让我困惑的是,在execvp(argv[0], argv);
中,为什么我们要传递整个argv
作为第二个参数呢?那么假设argv[0]
是"ls -l"
,为什么我们必须传递整个argv
作为第二个参数呢?
假设argv[0]
包含"ls -l"
,那么您就有问题了。大多数系统没有文件"/bin/ls -l
“或"/usr/bin/ls -l
”(其中空格是名称的一部分),但这正是您要执行的文件。
exec*()
函数是用于执行进程的低级函数。第一个参数指定要运行的程序(通常是一个二进制文件;有时是第一行包含一行代码的脚本,如#!/bin/sh
)。对于execv()
、execvp()
、execve()
或execvpe()
,第二个参数是参数向量,就像main()
函数接收参数向量(或参数向量,因此是argv
)一样。这是一个以null结尾的程序参数列表。如果要使用选项-l
执行ls
命令,则需要在argv
中指定三个(!)值"ls"
、"-l"
和空指针:
char argv[] = { "ls", "-l", 0 };
使用execl*()
函数,您指定要作为第一个参数运行的程序,然后是写出的参数向量:
execl("/bin/ls", "ls", "-l", (char *)0);
如果你有10个参数,你必须写出10个参数(加上空指针)。
在exec*()
函数中,名称包含:
l
-列表格式argumentsv
-向量格式argumentsp
-在程序上执行路径查找(如果给定的名称不包含slash)e
-采用环境变量的向量这些结合在一起可以提供:
execl()
execv()
execlp()
execle()
execvp()
execve()
没有execlpe()
和execvpe()
(但请参阅Linux扩展execvpe(3)
)有时会让人有点厌烦。传统的man 2 exec
页面也会在概要中省略其中的一些内容,但在手册页面的正文中提到它们-这一传统/传统至少可以追溯到1979年的第七版UNIX™(并一直延续到RHEL5Linux和MacOSX10.7.5;man 2 execl
页面提到了execve()
,但没有在概要部分列出它)。其他exec*()
函数都可以构建在execve()
之上--这是集合中的基本函数(因此在Linux手册中被列为execve(2)
)。
https://stackoverflow.com/questions/15017102
复制相似问题