为什么我们在execlp()的前2个参数中传递相同的值

时间:2015-09-19 13:16:40

标签: c exec

以下是函数声明:

int execlp(const char *file, const char *arg, ...);

以下是参数说明:

file: The executable that has to be executed by  the new process. This executable is searched for in the path specified by the environmental variable PATH. 

*arg,...: list of arguments terminated by a NULL argument.

然后我们为什么称这样的函数:

execlp("ls","ls",NULL);

赢了它变成" ls -ls"这是什么意思?

3 个答案:

答案 0 :(得分:3)

第一个是要加载以执行的二进制文件。第二个是进程的名称(例如,在ps的输出中显示)。它们是相同的很常见,但没有必要。

因此,在由exec*()执行的二进制文件中,您为该过程提供的名称可以argv[0]获得。

答案 1 :(得分:3)

关于execlp的this文件(由我添加的大胆字体)

  

execl(),execlp()和execle()函数中的const char * arg和后续省略号可以被认为是arg0,arg1,...,argn。它们一起描述了一个或多个指向以null结尾的字符串的指针的列表,这些字符串表示执行程序可用的参数列表。 按照惯例,第一个参数应指向与正在执行的文件关联的文件名。参数列表必须以NULL指针终止,并且由于这些是可变参数函数,因此必须将此指针强制转换为(char *)NULL。

答案 2 :(得分:2)

不,第一个参数是可执行文件的名称。例如,在许多UNIX系统中,您将具有指向单个可执行文件的符号链接,然后可执行文件可以确定它的调用方式。一个例子是BusyBox,它是一个单独的二进制文件,但它包含数十个和几十个命令的功能。

通常虽然名称与可执行文件相同,但大多数可执行文件并不关心名称。

例如,在BusyBox案例中,如果你打电话给execlp("/path/to/busybox", "ls", NULL);,它的行为就像命令ls那样,如果你打电话给execlp("/path/to/busybox", "ps", NULL);,它的行为就像ps命令。与符号链接相同的只是execlp("/path/to/ps", "ps", NULL);