execlp与我们一起运行命令
execlp("ps", "ps", NULL);
Run Code Online (Sandbox Code Playgroud)
这里可以看到冗余,因为我们通过了ps两次。此行为在所有exec变体中都是一致的。
为什么 exec 需要这样的冗余?为什么不这样写,以便我们可以简单地
execlp("ps", NULL);
Run Code Online (Sandbox Code Playgroud)
其他答案已经解释说您可能提供与argv[0]程序名称不同的名称,但没有解释为什么您可能想要这样做。
某些程序的行为有所不同,具体取决于用于调用它们的名称。一个常见的例子是 shell,例如sh、bash和csh。它们检查 的第一个字符argv[0],如果是,-它们将作为登录 shell 而不是常规 shell 运行。因此,当/bin/login调用用户的登录 shell 时,它会执行以下操作:
execlp("/bin/bash", "-bash", (char*)NULL);
Run Code Online (Sandbox Code Playgroud)
这样,bash就知道它是作为登录的一部分运行的,并且可以做出相应的行为。这可以使用选项参数来完成,但是每个可能用作登录 shell 的程序都必须识别该选项(某些特殊用户名的登录 shell 不是真正的 shell,而是其他程序,并且需要它们支持与真实 shell 相同的选项可能会出现问题)。