`execve()` 的 `argv [0]` 是否需要与 `pathname` 参数的基本名称部分相同?

`execve()` 的 `argv [0]` 是否需要与 `pathname` 参数的基本名称部分相同?

#include <unistd.h>
int execve(const char * pathname , char *const  argv [], char *const  envp []);

argv [0]ofexecve对应于argv[0]新程序的主函数,因此通常与pathname参数的基本名称部分相同。这是我们应该始终遵循的要求吗?

当程序文件可以通过不同的值调用时argv[0],该规则/约定是否意味着当我调用程序文件并希望argv[0]main()具有特定值时,我必须创建一个指向以值命名的程序文件的符号链接argv[0],并通过符号链接调用程序?还是不一定?例如,这是“为什么 argv 包含程序名称?”的答案

argv[0]当是 时,Bash 以 POSIX 模式运行sh。当argv[0]以 开头时,它作为登录 shell 运行-

这是否意味着

  • 要在 POSIX 模式下调用 bash,我必须创建一个符号链接/path/to/sh/bin/bash通过execve("/path/to/sh", argv, ...)指向argv[0]string "sh"?来调用 bash这种方式比execve("/bin/bash", argv, ...)whereargv[1]指向字符串"--posix"并且argv[0]无关紧要更好吗?

  • 要调用 bash 作为登录 shell,我必须创建一个符号链接/path/to/-/bin/bash通过execve("/path/to/-", argv, ...)指向argv[0]string "-"?来调用 bash。这种方式是否比指向字符串的execve("/bin/bash", argv, ...)位置更可取并且无关紧要?argv[1]"--login"argv[0]

argv [0]of execve is什么时候有用不一样作为pathname参数的基本名称组成部分?

答案1

您链接到的问题的接受答案说

首先,请注意这argv[0]不一定是程序名称。

这解决了你的主要问题。

您关于启动计划的各种问题似乎源于误解。您不需要使用链接(符号链接或硬链接)来启动argv[0]设置为名称以外的值的程序;您需要能够控制给予 的数组execve。这就是login启动 shell 时所做的事情:它以-in为前缀argv[0]

argv[0]Bash 在启动时以 POSIX 模式启动sh,因此可以用作/bin/sh.如果需要使用--posix,则需要更改大量 shell 脚本。

同样的推理也适用于-登录 shell:此约定适用于任何 shell,无论它--login是否支持选项。

登录用例是一个argv[0]不等于程序名称很有用的例子。

相关内容