为什么我们在 `execlp` 中双重声明可执行文件名称?

mar*_*trz 3 c exec

execlp与我们一起运行命令

execlp("ps", "ps", NULL);
Run Code Online (Sandbox Code Playgroud)

这里可以看到冗余,因为我们通过了ps两次。此行为在所有exec变体中都是一致的。

为什么 exec 需要这样的冗余?为什么不这样写,以便我们可以简单地

execlp("ps", NULL);
Run Code Online (Sandbox Code Playgroud)

Bar*_*mar 6

其他答案已经解释说您可能提供与argv[0]程序名称不同的名称,但没有解释为什么您可能想要这样做。

某些程序的行为有所不同,具体取决于用于调用它们的名称。一个常见的例子是 shell,例如shbashcsh。它们检查 的第一个字符argv[0],如果是,-它们将作为登录 shell 而不是常规 shell 运行。因此,当/bin/login调用用户的登录 shell 时,它会执行以下操作:

execlp("/bin/bash", "-bash", (char*)NULL);
Run Code Online (Sandbox Code Playgroud)

这样,bash就知道它是作为登录的一部分运行的,并且可以做出相应的行为。这可以使用选项参数来完成,但是每个可能用作登录 shell 的程序都必须识别该选项(某些特殊用户名的登录 shell 不是真正的 shell,而是其他程序,并且需要它们支持与真实 shell 相同的选项可能会出现问题)。