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

为什么在execlp()的前2个参数中传递相同的值,c,exec,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 arg

以下是函数声明:

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

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

因此,在由
exec*()
执行的二进制文件中,您为进程指定的名称可以从关于execlp的文档中找到
argv[0]

(我添加了粗体字体)

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


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

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


例如,在BusyBox情况下,如果调用
execlp(“/path/to/BusyBox”,“ls”,NULL)
它的行为与命令ls应该和如果调用execlp(“/path/to/busybox”,“ps”,NULL)一样它的行为类似于
ps
命令。与符号链接相同的是
execlp(“/path/to/ps”,“ps”,NULL)

与此相关的是
ls
而不是
ls-ls
。是的,您是正确的,但我无法将其与手册页中的任何内容联系起来:)在这种情况下,使用符号链接,它们仍然是相同的。但是您可以通过编程方式(不带符号链接)调用busybox,使用
execlp(“busybox”,“ls”,NULL)执行
ls
@FelixPalmen我不确定我是否明白你的意思。我的意思是,如果您有一个名为
ls
的符号链接,指向一个名为
foo
的程序,那么您将收到作为argv[0]而不是foo的ls。您的意思是,当
execlp
ing时,您将为这两个值编写相同的值?这是真的。只是解释为什么它们会不同。我的意思是,在这种情况下,shell仍然会将
ls
放在
exec*()
函数族的第一个参数以及参数列表的第一个位置。@SamiKuhmonen:那么你的意思是,如果你有一个名为ls的符号链接指向一个名为foo的程序,您必须调用execlp(“foo”,“ls”,NULL);?现在我明白了,我给了execlp(“ping”,“myping1”,“135.250.134.23”,NULL);在一个程序中,ps命令的输出显示“myping1 135.250.134.23”,所以第二个参数是进程的名称。文件名是否可以与正在执行的文件不同?您能否给出进程名称与二进制名称不同的任何示例。。。。除了百事通。。。因为我不熟悉busybox,如果我给execlp(“ls”,“pankaj”,NULL),它会工作吗?它是否像“这里的流程名称将是pankaj”?@pankajkushwaha是的。尝试运行比
ls
稍长一点的东西,并用
ps
验证:)是的,我验证了,我给了execlp(“ping”,“myping1”,“135.250.134.23”,NULL);在一个程序中,ps命令的输出显示为“myping1 135.250.134.23”,所以第二个参数是进程的名称,所以这意味着我们可以使用函数的第二个参数为进程指定不同于二进制的名称:)我一直认为,进程名称将始终与二进制名称相同,但我错了:)@pankajkushwaha这只是惯例,可能是因为它有助于用户识别流程,Shell也会遵循它。但是,在某些(罕见的)情况下,使用不同的进程名称是很有用的。