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

标签 c exec

要使用 execlp 运行命令,我们可以这样做

execlp("ps", "ps", NULL);

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

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

execlp("ps", NULL);

最佳答案

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

一些程序的行为因调用它们所用的名称而异。一个常见的例子是 shell,例如shbashcsh。他们检查 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/

相关文章:

c - Shmget 返回值 -1

c - "cannot convert to a pointer type"通过指针访问结构

c - 执行返回-Ubuntu

sql - 从 Powershell 执行存储过程

C、char** 奇怪的输出

c - 程序返回字符而不是字符串

c - 陷入位图的实现中

go - 在 Go 中为 CMD 执行 'cd' 命令

c++ - 将命令行字符串解析为 argv 格式

c - 使用 execvp() 调用 Linux ps 命令