要使用 execlp
运行命令,我们可以这样做
execlp("ps", "ps", NULL);
这里可以看出冗余,因为我们传递了两次 ps
。此行为在所有 exec
变体中都是一致的。
为什么 exec 需要这样的冗余?为什么不写成这样我们就可以简单的
execlp("ps", NULL);
最佳答案
其他答案已经解释说您可以提供与程序名称不同的 argv[0]
,但没有解释为什么您可能想要这样做.
一些程序的行为因调用它们所用的名称而异。一个常见的例子是 shell,例如sh
、bash
和 csh
。他们检查 argv[0]
的第一个字符,如果这是 -
,他们将作为登录 shell 而不是常规 shell。因此,当 /bin/login
调用用户的登录 shell 时,它会执行如下操作:
execlp("/bin/bash", "-bash", (char*)NULL);
这样,bash
就知道它是作为登录的一部分运行的,并且可以相应地运行。这可以使用选项参数来完成,但是每个可能用作登录 shell 的程序都必须识别该选项(一些特殊用户名的登录 shell 不是真正的 shell,而是其他程序,并且需要它们支持与真实 shell 相同的选项可能会有问题)。
关于c - 为什么我们在 `execlp` 中双重声明可执行文件名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41229382/