2015-09-19 31 views
3

继传相同的值是函数声明:为什么我们在第一个2参数execlp()的

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”,是什么意思?

+0

因此,它将是'ls'而不是'ls -ls'。 – ameyCU

+0

是的,你是正确的,但我只是无法将它与任何写在手册页:) :) –

回答

2

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

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

+0

你可以给任何例子,进程名称不同于二进制名称....除了busybox ...因为我不是熟悉busybox, –

+0

如果我给execlp(“ls”,“pankaj”,NULL); ,它会起作用吗?它是否像“进程名称将在此处显示”一样? –

+0

@ pankajkushwaha是的。尝试使用比'ls'运行更长的东西,并用'ps'验证:) –

3

this文件关于execlp(由我加粗体字体)

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

+0

文件名可以不同于正在执行的文件吗? –

2

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

虽然名称与可执行文件相同,但大多数可执行文件并不在乎名称是什么。

因此,例如在BusyBox的情况下,如果你会打电话execlp("/path/to/busybox", "ls", NULL);它会表现为命令ls应该,如果你会打电话execlp("/path/to/busybox", "ps", NULL);它会表现得像ps命令。与符号链接相同的只是execlp("/path/to/ps", "ps", NULL);

+0

在这种情况下,使用符号链接,它们仍然是一样的。但是你可以通过编程方式调用busybox(没有符号链接)来执行'ls'和'execlp(“busybox”,“ls”,NULL);' –

+0

@FelixPalmen我不知道我跟着你。我的意思是如果你有一个称为'ls'的符号链接指向一个名为'foo'的程序,你会收到* ls *作为argv [0]而不是* foo *。你的意思是说,当'execlp'你会写两个相同的值?那是真实的。只是解释他们为什么会不同。 –

+0

我的意思是在这种情况下,shell仍然会在'exec *()'系列函数的第一个参数中以及参数列表的第一位置中放置'ls'。 –

相关问题